描述:
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
给出一条单链表,删除指定值的节点,返回更新后的链表
两种解法:
1.设定一个指向头节点的node节点,再让head节点从这个前导节点开始遍历
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* temp;
temp->next = head; //设定一个前导指针
head = temp; //head现在指向它的前一个指针
while(head->next != NULL){
if(head->next->val == val){
head->next = head->next->next;
}
else{
head = head->next;
}
}
return temp->next;
}
};
python:
class Solution(object):
def removeElements(self, head, val):
temp = ListNode(0)
temp.next = head
head = temp
while head.next != None:
if head.next.val == val:
head.next = head.next.next
else:
head = head.next
return temp.next
2.逐项考虑情况,主要考虑队头
1.从头部开始的时候如果遇到相等的,直接就可以将head往更新为下一个元素。直到第一个不相等,或者NULL时,跳出循环
2.如果是为NULL就不进入循环,如果是第一个不等元素,直接判断下一个是否相等,相等temp.next = temp.next.next跳过这个相等的元素,否则temp = temp->next;继续下一个判断。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
while(head != NULL && head->val == val){
head = head->next;
}
//这里把前面的相等元素全剔除掉了,这时候的head是第一个不等于val值的,或者是为NULL
ListNode* temp = head;
while(temp != NULL && temp->next != NULL){
if(temp->next->val == val){
temp->next = temp->next->next;
}
else{
temp = temp->next;
}
}
return head;
}
};
python:
class Solution(object):
def removeElements(self, head, val):
while head != None and head.val == val:
head = head.next
temp = ListNode(0)
temp = head
while temp != None and temp.next != None:
if temp.next.val == val:
temp.next = temp.next.next
else:
temp = temp.next
return head
总结:
在遇见单项链表问题的时候,第一时间要考虑到构造一个前导指针(指向当前元素的元素),用前导指针来操作当前元素,简单明了