删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5
注意链表是乱序的,而且节点值为val的可能有多个
这道easy题想了半天,还是没有做出来。最开始想的是按照之前的链表题那样利用pre和cur两个指针两个指针,前者所经过的为已经去掉了待删除节点的链表,cur开路,结果一开始显示NULL pointer错误,于是改了改,但发现如果尾节点的val值是给定值的话,则不能删除。后来参考了一下Grandyang大大的答案,恍然大悟,即遍历时利用一个指针就可以完成。而且之前错误的提交中要判断的指针指向节点是否存在的语句太多,不仅显得杂乱,而且也不利于思考,总之还是自己掌握的知识太少,思路不宽阔的缘故。。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode *dummy = new ListNode(-1), *pre = dummy;
dummy->next = head;
while (pre->next) {
if (pre->next->val == val) {
ListNode *temp = pre->next;
pre->next = temp->next;
temp->next = NULL;
delete temp;
}
else
{
pre = pre->next;
}
}
return dummy->next;
}
};
思路:因为头节点可能是待删除节点,因此很显然我们先建立一个哑结点(dummy),并使其链上所给链表。之后我们每次判断的是pre->next对应节点的节点值,符合删除条件的话的话就利用delete将其删除。另外 temp->next = NULL; 有无皆可。
参考:http://www.cnblogs.com/grandyang/p/4606334.html