IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> ch2_5 链表两两交换节点&&ch2_6删除倒数N的节点 -> 正文阅读

[数据结构与算法]ch2_5 链表两两交换节点&&ch2_6删除倒数N的节点

lc24, 两两交换节点

问题关键点;

startNode: 表示两个交换节点的前一个节点, 称作开始节点, 初始位置为虚拟节点;

由于两个交换节点是在变化的, 所以应该在循环中执行:

node1: 表示第一个交换节点;
node2: 第二个交换节点;

交换之前顺序: startNode , node1, node2;
交换之后顺序: startNode, node2, node1;

交换的顺序

       // 交换顺序将开始节点的后一个节点 更新为 node2, 称为新的第一个节点node2;
    

        // 将原始节点node1 的后一个节点更新为原始节点Node2的 后一个节点;

        //  这里的思路是, 先假设 新的第二节点,已经产生;
        // 然后更新 新的第二个节点的后一个节点;
        // 将新的第一个节点的后一个节点更新为node1, 称为新的第二个节点node1;
 
        // 将开始节点 更新为 新的第二个节点node1; 
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode(0);

        ListNode* startNode = dummyHead;

        dummyHead->next = head;

        while(startNode->next != nullptr && startNode->next->next != nullptr  ){
            ListNode* node1 = startNode->next;
            ListNode* node2 = startNode->next->next;

            // 1. 先将开始节点的后一个节点更新为 node2,  称为新的第一个节点;
            startNode->next = node2;

            // 2.  将原始节点Node1的后一个节点更新为 原始node2 的后一个节点;
            // 这里的思路是, 先更新了 新的第二个节点 的后一个节点, 
            // 代表了 Node1 将 成为新的 第二个节点;
            node1->next = node2->next;

            //3. 将新的第一节点node2 后面的一个节点更新为node1, 成为新的第二个节点;
            node2->next  = node1;

            //  将 开始节点 更新为 新的第二个节点;

            startNode = node1;

        }

        return dummyHead->next;
    }
        

    
};

2.删除倒数 第 N 个节点;

思路:

  1. 首先 使用 两个快慢指针 fast, slow, 并确保两者之间的间隔为N,

  2. 让fast 先行走 N 步, 然后 再让 fast, slow 同时移动, 这样 fast 到达结尾时, slow 到达了比他慢的N 步的节点位置, 这个位置便是我们要删除的 倒数第N个节点;

但是, 实践中, 当我们要删除某个节点时, 我们需要定位的位置是 待删除节点的前一个节点;

所有我们要定位的节点位置是, 待删除节点的前一个节点:

怎么办?

  1. 让fast 先行走 N + 1 步, 然后同时移动 fast, slow;

  2. 当 fast 到达结尾时, slow 比fast 慢了 N -1 步,

此时fast 到达了 末尾节点处, 那么slowNode 到达了删除节点的前一个节点了;

2.1 code

struct ListNode{
    int val;
    ListNode* next;

    ListNode(int x): val(x), next(nullptr){}
};


class Solution{
public:

    ListNode*  removeNthFromEnd(ListNode* head, int n){
        ListNode*  dummyHead = new ListNode(0);
        dummyHead->next = head;

        ListNode* fastNode =  new ListNode(0);
        ListNode* slowNode =  new ListNode(0);

        fastNode = dummyHead;
        slowNode = dummyHead;

        int step = n + 1;
        while( step --){  // 让快指针先走n+1 步;  step = 0 时, 循环体不执行;
            fastNode = fastNode->next;
        }

        while( fastNode != nullptr){  // 当fastNode 没有到达,最后一个节点时;
            slowNode = slowNode->next;
            fastNode = fastNode->next;
        }
         //  当fastNode 到达末尾指针时,  slowNode  到达了 删除节点的前一个节点;

        ListNode* tmpNode;
        tmpNode = slowNode->next;
        slowNode->next = slowNode->next->next;

        delete tmpNode;
        return dummyHead->next;

    }
};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:24:47  更:2022-04-15 00:29:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:28:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码