Remove Linked List Elements
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
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
注意第一个节点和最后一个节点的处理
/**
* 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) {
if (!head) return NULL;
ListNode* pre,*h=head;
while (h && h->val == val && h->next){ // 删除在前面所有值为val的节点
h->val = h->next->val ;
h->next = h->next->next ;
}
if (h->val == val) return NULL; // 此时 必定只有一个元素
else { // pre 为 h 前面的节点
pre = h;
h = h->next;
}
while (h) { // 删除值为val的节点
if (h->val == val) {
pre->next = h->next;
h = h->next;
}
else {
pre = h;
h = h->next;
}
}
return 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* newH;
newH->next = head;
ListNode* cur = newH;
while (cur->next) {
if (cur->next->val == val) {
cur->next = cur->next->next;
}
else cur = cur->next;
}
return newH->next;
}
};