算法训练营第五天 | 203. 移除链表元素

张开发
2026/4/18 23:47:07 15 分钟阅读

分享文章

算法训练营第五天 | 203. 移除链表元素
给你一个链表的头节点head和一个整数val请你删除链表中所有满足Node.val val的节点并返回新的头节点。示例 1输入head [1,2,6,3,4,5,6], val 6输出[1,2,3,4,5]示例 2输入head [], val 1输出[]示例 3输入head [7,7,7,7], val 7输出[]思路此题删除链表中元素是很简单的只需要让待删节点之前一个节点指向待删节点之后一个节点即可。此题最大的问题就是题目要求我们要返回新链表中的头结点如果我们就采用仅仅复制头结点的方式(用Hhead)然后用H进行操作最后返回head。这样就会导致如果头结点也是我们需要删除的节点就会导致错误。当然我们可以采用循环操作判断第一个不是我们要删除的节点但是这样有些麻烦。最好的方式就是我们创建一个新节点来作为整个链表的头结点该节点中的值没有意义只是用该节点来方便我们的操作。如果用H-nexthead; 此时 我们操作H的话就把原先的头结点当做了一个普通节点来操作此时原先的头结点就可以被删除了。最后返回H-next就满足条件了。正是由于有个无意义节点作为头结点会统一操作把头结点当做普通节点所以实际链表设计过程中都是有个无意义头结点的遇到头结点不好解决的问题class Solution { public: ListNode* removeElements(ListNode* head, int val) { if(headNULL) return NULL; ListNode*H new ListNode(-1); H-next head; ListNode*p H; ListNode*s NULL; while(p-next!NULL) { if(p-next-valval) { s p-next; p-next p-next-next; delete s; }else p p-next; } return H-next; } };

更多文章