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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构——链表基础(三) -> 正文阅读

[数据结构与算法]数据结构——链表基础(三)

本期我们就主要单链表利用双指针解决经典问题的技巧进行分析讲解

表解体经典思路解法——双指针的应用

本期我们讲解的链表面试题使用的技巧都是一样,主要通过利用两个指针来解决问题。上期我们讲解的链表环的问题其中快慢指针方法也用到了这种技巧

经典面试题:链表相交的问题

给定两个单链表,判断是否有相交,相交的话找到最开始的交点

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //进行非空判断
        if (headA == null || headB == null) {
            return null;
        }
        //分别记录每个链表的长度
        int lenA = 1;
        int lenB = 1;
        ListNode tempA = headA;
        ListNode tempB = headB;
        while (tempA.next != null) {
            lenA++;
            tempA = tempA.next;
        }
        while (tempB.next != null) {
            lenB++;
            tempB = tempB.next;
        }
        //看两个链表是否相交
        if (!tempA.equals(tempB)) {
            return null;
        }
        //利用双指针的技巧,遍历找到焦点
        int reduseCount = lenA - lenB;
        tempA = headA;
        tempB = headB;
        if (reduseCount > 0) {
            for (int i = 0; i < reduseCount; i++) {
                tempA = tempA.next;
            }
        } else {
            reduseCount = Math.abs(reduseCount);
            for (int i = 0; i < reduseCount; i++) {
                tempB = tempB.next;
            }
        }
        while (tempB != null && tempA != null) {
            if (tempB.equals(tempA)) {
                return tempB;
            }
            tempA = tempA.next;
            tempB = tempB.next;
        }
        return null;
    }

思路:主要利用双指针的技巧,先将比较长的那个链表截取后部分,然后使得两个链表长度相同,此时从起点同时向后走会同时到达终点,其中必定同时到达第一个相交处。两个指针分别向后走,然后分别比较,如果指向相同节点,那么说明找到了相交处,然后返回。

经典面试题:链表删除倒数某个节点

删除链表的倒数第K个节点

**思考:**看到题目首先我们想到的是一定是遍历两便链表,第一遍首先知道链表的长度,然后算出何时可以从头到倒数第K个节点,然后直接在第二遍遍历时候取出来。但是有没有一种方法只遍历一遍就可以得到结果呢?这里我们使用双指针方式来解决。我们直接上代码:

  public ListNode removekthFromEnd(ListNode head, int k) {
        if (head == null) {
            return null;
        }
        ListNode first = head;
        ListNode sec = head;
        for (int i = 0; i < k; i++) {
            first = first.next;
        }
        while (first != null && first.next != null) {
            first = first.next;
            sec = sec.next;
        }
        sec.next = sec.next.next;
        return head;
    }

思路:这是一个双指针法思路来解决的典型例题。首先让指针first指向头节点,然后让其向后移动k步,然后指针sec指向头结点和first同时以相同的速度向后移动。first的next指针为NULL同时sec就指向了要删除节点的前一个节点,接着让sec指向的next指针指向要删除节点的下一个节点就可以将对应的节点删除。

经典面试题:查找链表中的中间节点

我们直接上代码:

public ListNode SearchMid(ListNode head) {
        ListNode p = this.head, q = this.head;
        while (p != null && p.next != null && p.next.next != null) {
            p = p.next.next;
            q = q.next;
        }
        return q;
}

思路:这个题目和上期我们解决的含有环的链表类似,用到了快慢指针,让快指针的速度是慢指针的速度的两倍,那么当快指针到达了终点,那么慢指针就正好到达中间的位置。
在这里插入图片描述

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

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