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. 两两交换链表中的节点

?

?递归法:

1 找终止条件(递归到链表为空或者链表)

2 找返回值? (返回给上一层递归的值是已经交换完成的子链表)

3 单次过程: 只考虑某一步是怎么完成的,我们假设交换的两个节点分别为head,next,next的应该接受上一级返回的子链表,相当于是一个含三个节点的链表交换前两个节点.

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode pre = head.next;// 存一下第二个节点
        head.next = swapPairs(pre.next); 头节点指向
        pre.next = head;//第二个节点指向头
        return pre;

    }
}

确定返回值,假如3 4交换,应该返回4号节点,(所以调用递归函数,其实就是调用递归的返回值,这个返回值是上一层递归的结果)所以是next节点,单层交换逻辑只看 12 节点

?

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

我的思路:创建虚拟头节点,先统计有多少个节点,让处理倒数第n个节点,那么我们正向处理的就是num - n的节点,最后让节点指向他下下个节点,这里判断是否会有下下个节点,没有返回null就好.?

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode count = dummy;
        int num = 0;
        while(count.next!= null){
            count = count.next;
            num++;
        }
        
        ListNode fast = dummy;
        while((num-n) > 0 ){
            fast = fast.next;
            num--;
        }
        if(fast.next.next!= null){
            fast.next = fast.next.next;
        }else{
            fast.next = null;
        }
        return dummy.next;
    }
}

快慢指针法,我让快指针先走n个节点,然后同时向前走到节点为null,这样慢指针所指的节点就是倒数第n个几点,这样删除慢指针所指向的节点就ok了

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode slow = dummy;
        ListNode fast = dummy;
        while(n-- > 0) {
            fast = fast.next;
        }
        ListNode prev = dummy;
        while(fast != null) {
            prev = slow;
            slow = slow.next;
            fast = fast.next;
        }
        prev.next = slow.next;
        slow.next = null;
        return dummy.next;
    }
}

面试题 02.07. 链表相交

思路:哈希集合,可以用哈希集合存储链表节点。首先遍历链表A,将链表A节点加入哈希集合,然后遍历链表B,看看B内节点是否在哈希集合中,如果当前节点在哈希集合中,那么后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,返回该节点就好啦,如果B的所有节点不在哈希表中,返回null;

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        Set<ListNode> visited= new HashSet<>();
        ListNode temp = headA;
        while(temp !=null){
            visited.add(temp);
            temp = temp.next; 
        }
        temp =headB;
        while(temp!=null){
            if(visited.contains(temp)){
                return temp;
            }
            temp =temp.next;
        }
        return null; 
    }
}

这里需要注意:返回的是相同节点并不是相同的值,这里会产生误区,节点是又有值,又有指针

142. 环形链表 II

?

?数学知识

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

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

推出 s = nb

方法二:快慢指针第一次相遇时,就知道环的长度。然后再让快慢两个指针从头跑,快指针先移动,每次移动环的长度。慢指针每次移动一个。这样相当于慢指针每走一步,快指针就将环走了一遍,相遇的时候就是入口了,这样也是能AC的。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null && fast.next !=null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
                ListNode Index1 = fast;
                ListNode Index2 = head;
                // 两个指针,从头结点和相遇结点,各走一步,直到相遇,相遇点即为环入口
                while(Index1!= Index2){
                    Index1 = Index1.next;
                    Index2 = Index2.next;
                }
                return Index1;
            }
        }
        return null;
    }
}

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

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