首页 > 其他分享 >代码随想录第四天|力扣24.两两交换链表节点、力扣19.删除链表的倒数第N个结点、力扣面试02.07链表相交、力扣142.环形链表

代码随想录第四天|力扣24.两两交换链表节点、力扣19.删除链表的倒数第N个结点、力扣面试02.07链表相交、力扣142.环形链表

时间:2023-07-30 23:55:29浏览次数:43  
标签:力扣 ListNode cur val 随想录 next 链表 null 指针

两两交换链表中的节点(力扣24.)

  • dummyhead .next = head;
  • cur = dummyhead;
  • while(cur.next!=null&&cur.next.next!=null)
  • temp = cur.next;
  • temp1=cur.next.next.next;
  • cur.next= cur.next.next;
  • cur.next.next=temp;
  • temp.next=temp1;
  • cur = cur.next.next;
  • return dummyhead.next;
/**
 * 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 swapPairs(ListNode head) {
        //只是用一个temp指针
            ListNode dummyHead = new ListNode();
            dummyHead.next = head;
            ListNode cur = dummyHead;
            while(cur.next != null && cur.next.next != null){
                //临时指针存储cur的next,因为在操作后会变成孤立节点
                ListNode temp = cur.next;
                //操作进行
                cur.next = cur.next.next;
                temp.next = cur.next.next;
                cur.next.next = temp;
                //下一循环
                cur = cur.next.next;
            }
            return dummyHead.next;
    }
}

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

  • 双指针
  • 等距离双指针删除链表倒数第N个元素,注意指针应该停留在删除目标的前一个元素
  • 为实现上述目标可以令快指针先走n+1步且终止条件为fast==null
  • 或者快指针先走n步且终止条件为fast.next==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 dummyHead = new ListNode();
        dummyHead.next = head;
        ListNode cur = dummyHead;
        ListNode post = dummyHead;
        while(n > 0){
            post = post.next;
            if(post == null){
                return null;
            }
            n--;
        }
        while(post.next != null){
            post = post.next;
            cur = cur.next;
        }
        if(cur.next != null){
            cur.next = cur.next.next;
        }else{
            cur.next = null;
        }
        
        return dummyHead.next;
    }
}

面试题:链表相交(力扣面试题02.07)

  • 简单来说,就是求两个链表交点节点的指针。 交点不是数值相等,而是指针相等。
  • 我们求出两个链表的长度,并求出两个链表长度的差值,并令curA为长度更大的一方。然后让curA移动到,和curB 末尾对齐的位置,然后以此求两指针是否相同
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode curA = headA;
        ListNode curB = headB;
        int lenA = 0;
        int lenB = 0;
        while(headA != null){
            headA = headA.next;
            lenA++;
        }
        while(headB != null){
            headB = headB.next;
            lenB++;
        }
        headA = curA;
        headB = curB;
        if(lenA < lenB){
            ListNode temp = headB;
            headB = headA;
            headA = temp;
            int tempInt = 0;
            tempInt = lenB;
            lenB = lenA;
            lenA = tempInt;
        }
        int gap = lenA - lenB;
        while(gap != 0){
            headA = headA.next;
            gap--;
        }
        while(headA != null){
            if(headA == headB){
                return headA;
            }
            headA = headA.next;
            headB = headB.next;
        }
        return null;
    }
}

环形链表(力扣142.)

  • 判断链表是否有环
  • 返回环的入口(如果存在)
  • 快慢双指针判断是否有环:
  • 快指针每次走两个结点,慢指针每次走一个结点
  • 快指针对于慢指针的相对速度是每次一个结点
  • 因此快指针和慢指针一定会在环里相遇
  • y + z = 一圈;且y为慢指针在圈内走过的距离
  • slow = x + y
  • fast = x + y + n(y + z)//n为fast多余圈数
  • 又因为fast = 2 * slow
  • x + y + n(y+z) = 2(x + y)
  • x = n(y + z) - y;
  • 其中n应该大于等于1
  • x = (n - 1)(y + z) + z;
  • n=1时,x=z;两指针会在环入口相遇
  • n!= 1 时,同理
  • 即从相遇的地方开始,与起点开始的指针以相同速度移动,最后相遇的点就是入口
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        //快慢指针,从快慢指针交界点开始与另一指针从头节点开始以相同速度进行,交点即为环入口
        ListNode fast = head;
        ListNode slow = head;
        ListNode target = head;
        if(fast == null){
            return null;
        }
        while(fast.next!= null &&fast.next.next !=null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
                break;
            }
        }
        if(fast.next == null||fast.next.next==null){
            return null;
        }
        while(target != slow){
            slow = slow.next;
            target = target.next;
        }
        return target;
    }
}

标签:力扣,ListNode,cur,val,随想录,next,链表,null,指针
From: https://www.cnblogs.com/zcctxr/p/17592388.html

相关文章

  • 【ACM专项练习#02】整行字符串、输入vector、打印图形、处理n组数据以及链表操作等
    输入整行字符串平均绩点题目描述每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。输入有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。输出每组输出结果占一行。如果输入的大......
  • 代码随想录算法训练营第四天| LeetCode 24. 两两交换链表中的节点 19.删除链表的倒
    24.两两交换链表中的节点     卡哥建议:用虚拟头结点,这样会方便很多。 本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。   题目链接/文章讲解/视频讲解:https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%......
  • 力扣-接雨水1
    1.问题描述给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以届6个单位的雨水(蓝色表示雨水)。示例:输入:[0,1,0,2,1,0,1,3,2,1,2,1]输出:62.输入说明输入......
  • 力扣---142. 环形链表 II
    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。如果......
  • 力扣---6900. 统计完全子数组的数目
    给你一个由 正 整数组成的数组 nums 。如果数组中的某个子数组满足下述条件,则称之为 完全子数组 :子数组中 不同 元素的数目等于整个数组不同元素的数目。返回数组中 完全子数组 的数目。子数组 是数组中的一个连续非空序列。 示例1:输入:nums=[1,3,1,2,2]......
  • 力扣-前k个高频元素
    1.问题描述给定一个非空的整数数组,返回其中出现频率前k高的元素。示例1:输入:nums=[1,1,1,2,2,3],k=2输出:[1,2]示例2:输入:nums=[1],k=1输出:[1] 说明:你可以假设给定的k总是合理的,且1≤k≤数组中不相同的元素的个数。你的算法的时间复杂度......
  • 链表之差的绝对值
    假设链表中每一个节点的值都在0-9之间,那么链表整体就可以代表一个非负整数。给定两个这种链表,请生成代表两个整数之差绝对值结果链表。链表长度最大值为10000,链表任意值0≤val<9要求:空间复杂度O(n),时间复杂度O(n)例如:链表1为9->3->7,链表2为9->6->3,最后生成新的结果链表为2-~>......
  • 力扣-任务调度器
    1.问题描述给定一个用字符数组表示的CPU需要执行的任务列表。其中包含使用大写的A-Z字母表示的26种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在1个单位时间内执行完。CPU在任何一个单位时间内都可以执行一个任务,或者在待命状态。然而,两个相同种类的......
  • 代码随想录算法训练营第三天|力扣203.移除链表元素、力扣707.设计链表、力扣206.反转
    链表定义:通过指针串联在一起的线性结构,每一个节点由两个部分组成:数据域和指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null,即为空指针。链表类型1.单链表2.双链表3.循环链表,即链表首尾相连,可以解决约瑟夫环问题链表的存储方式数组在内存中是连续分布的,......
  • 反转链表
    title:反转链表date:2023-07-3009:25:12tags:-c/c++categories:-算法-笔试top:反转链表题目来自acwing题目(点击跳转)定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思考题:请同时实现迭代版本和递归版本。数据范围链表长度[0,30]......