D4 203. 移除链表元素 + 206. 反转链表

203 移除链表元素(力扣:https://leetcode.cn/problems/remove-linked-list-elements

条件: 移除链表中值等于val的节点,并且返回一个新的head;
Tips:

  1. 新建了一个临时head让原head也可以参与node遍历循环中;
  2. 注意替换时要先用临时节点存储要删除节点的地址、再进行脱离删除(见代码注释)

初版代码:

点击查看代码
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;
    }
};
posted @ 2026-01-11 00:20  SCONLY  阅读(8)  评论(0)    收藏  举报