7.16 链表简单&中等 206 203 237 19

206 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
存储next(next = curr->next),得到头部,链接至新的节点前(curr->next = prev; prev = curr;),更新链表(curr = next)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        // 初始化三个指针 , 一个用于存储逆向 一个用于存储head中的后面 一个用与中间值转圜
        ListNode* prev = nullptr;
        ListNode* curr = head;
        ListNode* next = nullptr;

        while(curr != nullptr){
            next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }

        return prev;
    }
};

203 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 初始化虚拟头节点
        ListNode* dummy = new ListNode(0);
        dummy->next = head;

        ListNode* prev = dummy;
        ListNode* latt = head;

        while (latt != nullptr) {
            if (latt->val == val) {
                // 删除节点
                prev->next = latt->next;
            } else {
                prev = latt;
            }
            latt = latt->next;
        }

        // 返回新的头节点
        ListNode* new_head = dummy->next;
        delete dummy;  // 释放虚拟头节点
        return new_head;
    }
};

也可以直接把latt替换成prev->next。

237 删除节点

在这里插入图片描述
在这里插入图片描述
即可将node理解为已经遍历到位的head链表中的结点指针,区别在于这个node位置处于被删除结点,且不能直接释放,所以需要将next结点全部移到node上。

class Solution {
public:
    void deleteNode(ListNode* node) {
        node->val = node->next->val;
        ListNode* temp = node->next;
        node->next = node->next->next;
        delete temp;
    }
};

19 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
让prev和latt差n个结点就可以了,当latt->next == nullptr时 prev->next = prev->next->next;

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        //虚拟头部
        ListNode* dum = new ListNode(0);
        dum->next = head;

        ListNode* prev = dum;
        ListNode* latt = dum;

        //移开prev和latt的位置
        for(int i = 0 ; i <= n ;i++){
            latt = latt->next;
        }

        while(latt !=nullptr){
            prev = prev->next;
            latt = latt->next;
        }
        prev->next = prev->next->next;

        ListNode* new_head = dum->next;
        delete dum;
        return new_head;
    }
};

虚拟头节点dummy

ListNode* dummy = new ListNode(0);
dummy->next = head;
//如果要删除、增加结点在head中,指针直接指向dummy。例如:
ListNode* temp = dummy;
//经过一系列操作后....
ListNode* new_head = dummy->next;
delete dummy;
return new_head;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值