1.题目
删除链表中等于给定值val
的所有节点。
给出链表1->2->3->3->4->5->3
, 和 val = 3
, 你需要返回删除3之后的链表:1->2->4->5
。
2.思路
这个题的删除和用O(1)复杂度删除节点是一样的。首先重新接入一个新的节点,然后让旧头结点head依次下移查找其下个的值是否等于val,如果等于val则用下下个覆盖下个,这样就完成了对重复元素的删除;如果其下个的值不是val,则下个赋值给head,也就是继续依次下移。
3.代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution{
public:
/**
* @param head a ListNode
* @param val an integer
* @return a ListNode
*/
ListNode *removeElements(ListNode *head, int val) {
// Write your code here
ListNode *dummy =new ListNode(0);
dummy->next =head;
head =dummy;
while (head->next !=NULL) {
if (head->next->val ==val)
{head->next =head->next->next;}
else
{head =head->next;}
}
return dummy->next;
}
};
4.感想
这个题最大的启发是要记得在旧的头指针依次下移前先建立新的头指针让它不动,否则原来的头指针移走了,最后返回时就找不到头了!