题目要求:删除链表中等于给定值val的所有节点。
样例
给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。
思路:刚开始想着用一个指针实现,可是老是卡在这个1->1->NULL这个例子这里,输出的结果是runtime error。后面,受启发,我为什么不用两个指针来实现,一个指针p用来存放当前的地址,一个指针q用来存放下一个地址。
`/**
* 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 *result=head;
if(head == NULL) return head;
ListNode *p=head, *q=head->next;
while(q != NULL)
{
if(q->val == val)
{
p->next=q->next;
}
else
{
p=p->next;
}
q=q->next;
}
if(head->val == val)//为了防止第一个元素即为待删除元素而出现遗漏,所以进行该判断
head=head->next;
return head;
}
};`
以上是正确的代码。后面是错误的代码
/**
* 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 *result=head;
if(head == NULL) return head;
ListNode *p=head, *q=head->next;
while(head->next != NULL)
{
if(head->next->val == val)
{
head->next=head->next->next;
}
else
{
head=head->next;
}
head->next=head->next->next;
}
if(head->val == val)
head=head->next;
return head;
}
};
提示Runtime Error!
分析原因:head始终是变成其后面一个地址,因此head->next=head->next->next;表示的是存放的是其后面第3个地址,这与预想不是一致,这种思路必须得需要两个变量存放指针才能实现。