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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【LeetCode】单链表技巧 (哑结点快慢指针交换/删除结点操作) -> 正文阅读

[数据结构与算法]【LeetCode】单链表技巧 (哑结点快慢指针交换/删除结点操作)


提示:以下是本篇文章正文内容,下面案例可供参考

一、哑结点

在leetcode平台中, 单链表的头结点同时也作为链表的第一个结点使用

也就是说, 相对于王道数据结构书上前面几篇博客 的单链表表示方法中, 使用一个无数据域的结点作为虚拟头结点(head结点)的这种方式, 在做力扣单链表题时, 会使用到添加哑结点dummy的技巧. 这也就是前文说的虚拟头结点的技巧;

一句话就是, 在leetcode题解中在链表第一个结点钱添加dummy哑结点就等同于构造了一个带有虚拟头结点的单链表

二、快慢指针

在leetcode-19题中, 使用到了快慢指针的技巧, 这道题的要求是删除倒数第N个结点

下面是题解

/**
 * 快慢指针
 * 快指针先走n个位置,与慢指针拉开n
 * 然后快慢指针同时再向后移动,
 * 直到快指针走到表尾了,删除掉慢指针指向的元素
 * */
ListNode* removeNthFromEnd(ListNode* head, int n) {
    // dummy指向第一个结点
    // dummy 哑结点,在链表头结点前再接上去的一个结点
    ListNode* dummy = new ListNode(0, head);
    ListNode* first = head; // 快指针指向第一个结点
    ListNode* second = dummy; // 慢指针指向哑结点
    for (int i = 0; i < n; ++i) { // 快指针先出发n位
        first = first->next;
    }
    while (first) {
        first = first->next;
        second = second->next;
    }
    second->next = second->next->next; // 删除倒数第n个位置的元素
    ListNode* ans = dummy->next; // dummy->next指向了第一个结点
    delete dummy;
    return ans;
}

当使用快慢指针时, 由于添加了哑结点, 因此慢指针自然而然地指向了哑结点(也就是链表第一个结点的前一个位置), 这样快慢指针就自然地区分开了. 而且当链表的结点只有一个时, 也不用判断快慢指针是否指在同一个结点上;

对于这道题, 使用快慢指针, 让fast指针先出发n位, 与slow拉开n位的差距, 这样当fast指空时, slow刚好位于需要删除的结点的前一个位置,这样接下来只要执行删除操作即可;

三、交换/删除结点

在单链表中, 交换和删除结点都是常考的操作

  • 删除结点
// 删除fast指向的结点
p->next = p->next->next;

// q指向被删除结点
q = p->next;
p->next = q->next; // 将q指向的结点从链表中断开
  • 交换结点

在这里插入图片描述

p->next = node_2; // 1
node_1->next = node_2->next; // 2
node_2->next = node_1; // 3

在第2步中, node1必须先和node2的后继连接上,防止后继丢失


未完待续… …

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 23:27:37  更:2022-04-06 23:28:21 
 
开发: 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 9:53:31-

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