Remove all elements from a linked list of integers that have value val.
Example
Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
Return: 1 --> 2 --> 3 --> 4 --> 5
分析:
这个问题肯定是的有两个指针,一个指向当前所要检测的节点,另外一个是指向所检测节点之前的节点,这样子就可以直接修改指针,达到删除元素的效果。实际编程的时候有两个地方应该考虑到,就是如果起手第一个元素就是的,也就是所现在链表的第一个元素都要删除了,那么就要修改head指针,因为最后返回的是head指针。第二个就是如果删除掉一个元素之后,移动的只是当前检测的指针,而当前检测指针的前项指针是不用动的。
代码如下:
/**
* 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 * p, *h;
h = head;
while(h){
if(head->val == val){
head = head -> next;//如果第一个元素就是要删除的,这个时候head指针是要修改的,因为最后返回的是head指针
}
else if(h->val ==val){
p->next = h->next;//删除掉指定的元素
h = h -> next;//将当前检测的指针向后移动一次,而当前检测元素的前项指针是不用动的
continue;
}
//这两行是正常的指针过度,即如果元素不是要删除的元素的时候,指针移动的情况
p = h;
h = h -> next;
}
return head;
}
};
所有的理解,代码注释里面写的也很清楚了。