D4 203. 移除链表元素 + 206. 反转链表
203 移除链表元素(力扣:https://leetcode.cn/problems/remove-linked-list-elements
条件: 移除链表中值等于val的节点,并且返回一个新的head;
Tips:
- 新建了一个临时head让原head也可以参与node遍历循环中;
- 注意替换时要先用临时节点存储要删除节点的地址、再进行脱离删除(见代码注释)
初版代码:
点击查看代码
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//DEFINE NEW HEAD WITH VAL = 0
ListNode* NH = new ListNode(0);
NH->next = head;
//使用current遍历
ListNode* current = NH;
while(current->next != nullptr){
if(current->next->val == val){
//使用delete每次都要新建储存节点
//这里先存一下要删除节点的地址
ListNode* todelete = current->next;
//指向该节点的指针转而指向下一位,该节点(地址)从链表脱离
current->next = current->next->next;
//释放事先存好的该节点地址的内存
delete todelete;
}else{
current = current->next;
}
}
ListNode* newHead = NH->next;
delete NH; // 释放虚拟头节点
return newHead;
}
};
206 反转链表(力扣:https://leetcode.cn/problems/reverse-linked-list
条件: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表;
Tips: 链表只是特殊在节点内部next存储了下一节点的地址,而节点本身是指针变量,存储的依然是该节点的内存地址,所以current->next = current是修改存储下一节点的地址(但是这样写会变成闭环,仅为说明用),current = current->next是让指针指向下一个节点
deepseek提供的双指针:
点击查看代码
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* current = head;
while(current != nullptr){
//用于存储当前节点的原下一位,后续遍历指针位移用
ListNode* tempStore = current->next;
//修改当前节点储存的下一位地址为上一位
current->next = prev;
//两个指针指向下一个节点
prev = current;
current = tempStore;
}
//由于prev处理完尾节点后无法再进入while,所以这里return的是原尾新头
return prev;
}
};
浙公网安备 33010602011771号