给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
思路:对于这个题用暴力解法来判断很多情况,来解决。但是昨天学到了可以用带一个头结点来取消这个对于头结点的判断,直接一个指针指到跟 val 值相等节点的前驱,然后用前驱的next连到next的next上面去。
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* HeadNode = (struct ListNode*)malloc(sizeof(struct ListNode));
HeadNode->next = head;
struct ListNode* cur = HeadNode;
while(cur->next){
if(cur->next->val == val){
cur->next = cur->next->next;
}
else{
cur = cur->next;
}
}
return HeadNode->next;
}
这段代码的可读性很差,不如试试双指针?
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* HeadNode = (struct ListNode*)malloc(sizeof(struct ListNode));
HeadNode->next = head;
struct ListNode* cur = HeadNode->next;
struct ListNode* prev = HeadNode;
while(cur){
if(cur->val == val){
prev->next = cur->next;
}
else{
prev = cur;
}
cur = cur->next;
}
return HeadNode->next;
}
对于链表他有天然的递归性,可以试着用栈,或者递归来操作一下。
struct ListNode* removeElements(struct ListNode* head, int val){
if(NULL == head){
return NULL;
}
struct ListNode* ret = removeElements(head->next,val);
if(head->val == val){
return ret;
}
else {
head->next = ret;
return head;
}
}