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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II -> 正文阅读

[数据结构与算法]代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

LeetCode 24. 两两交换链表中的节点

思路:一开始思路方向错误了,想着需要翻转列表,卡了好久,还导致链表内成环。其实画图看每个节点的next是哪个,分步骤走会简单很多。

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null)
            return head;
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode cur = dummy;
        while(cur != null && cur.next != null && cur.next.next != null){
            ListNode temp1 = cur.next;
            ListNode temp2 = cur.next.next;
            ListNode temp3 = cur.next.next.next;
            cur.next = temp2;
            temp2.next = temp1;
            temp1.next = temp3;

            cur = temp1;
        }
        return dummy.next;
    }
}
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null)
            return head;
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode prev = dummy;
        ListNode cur = head;
        while(cur != null && cur.next != null){
            ListNode temp = cur.next.next;
            prev.next = cur.next;
            prev.next.next = cur;
            cur.next = temp;
            prev = cur;
            cur = temp;
        }
        return dummy.next;
    }
}

?LeetCode?19.删除链表的倒数第N个节点

使用两趟扫描实现,第一趟求链表长度,第二趟才进行删除。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        int sz = 0;
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode cur = head;
        while(cur != null){
            sz++;
            cur = cur.next;
        }
        //System.out.println("sz: " + sz);
        cur = dummy;
        if(n == sz)
            return head.next;
        for(int i = 0; i < sz - n; i++){
            cur = cur.next;
        }
        cur.next = cur.next.next;
        return dummy.next;
    }
}

通过快慢指针实现一趟删除:

  • fast首先走n + 1步 ,同时移动的时候slow才能指向删除节点的上一个节点
  • fast和slow同时移动,直到fast指向末尾
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode fast = head;
        // fast先走(n+1)步,那样等fast到null的时候,slow就到要删除的节点的上一个节点
        while(n-- > 0){
            fast = fast.next;
        }
        if(fast == null)
            return head.next;
        fast = fast.next;
        ListNode slow = head;
        while(fast != null){
            fast = fast.next;
            slow = slow.next;
        }
        slow.next = slow.next.next;
        return head;
    }
}

?LeetCode?面试题 02.07. 链表相交

重点:交点不是数值相等,而是指针相等!

思路:

  • 考虑构建两个节点指针?A??,?B?分别指向两链表头节点?headA?,?headB
  • 指针?A?先遍历完链表?headA?,再开始遍历链表?headB
  • 指针?B?先遍历完链表?headB?,再开始遍历链表?headA
  • 若两链表公共尾部:指针?A?,?B?同时指向「第一个公共节点」node
  • 若两链表:指针?A?,?B?同时指向?null
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null){
            return null;
        }
        ListNode curA = headA;
        ListNode curB = headB;
        Boolean isLinked = false;
        while(curA != null || isLinked == false){
            if(curA == curB)
                break;
            if(curA.next == null && isLinked == false){
                isLinked = true;
                curA = headB;
            }else{
                curA = curA.next;
            }
            if(curB.next == null){
                curB = headA;  
            }else{
                curB = curB.next;
            }           
        }
        return curA;
    }
}

?LeetCode?环形链表II?

思路:设两指针?fastslow?指向链表头部?headfast?每轮走2步,slow?每轮走1步

根据:

  1. f=2s? (快指针每次2步,路程刚好2倍)

  2. f = s + nb (相遇时,刚好多走了n圈)

推出:s = nb

从head结点走到入环点需要走 : a + nb, 而slow已经走了nb,那么slow再走a步就是入环点了。

如何知道slow刚好走了a步? 从head开始,和slow指针一起走,相遇时刚好就是a步

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null || head.next == null)
            return null;
        ListNode fast = head;
        ListNode slow = head;
        do{
            if(fast == null || fast.next == null)
                return null;
            fast = fast.next.next;
            slow = slow.next;
        }while(fast != slow);
        fast = head;
        while(fast != slow){
            fast = fast.next;
            slow = slow.next;
        }
        return fast;
    }
}

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

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