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

代码随想录 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

时间:2024-02-26 21:22:43浏览次数:22  
标签:结点 ListNode cur 随想录 next 链表 节点 指针

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

思路:第一步:两两交换要考虑循环什么时候退出,当cur指针.next是null是就到尾部了,同理,链表不是奇数就是偶数,cur.next.next是空也是。

   第二步 循环条件判断完了接下来要实现交换,如图所示,按步骤来就好,提前将1,2,3存好,接下来按图走就行。

   最后一步 是cur如何向前去呢,将链表分成三个三个的形式来走循环,最后一步将变量指针cur=3即可

public ListNode swapPairs(ListNode head) {
            ListNode dummyhead = new ListNode(-1);
            dummyhead.next = head;
            ListNode cur = dummyhead;
            ListNode temp ;
            ListNode firstnode ;
            ListNode secondnode ;
            while (cur.next != null && cur.next.next != null){
                temp = cur.next.next.next;
                firstnode = cur.next;
                secondnode = cur.next.next;
                cur.next = secondnode;
                secondnode.next = firstnode;
                firstnode.next = temp;
                cur = firstnode;
            }
            return dummyhead.next;
    }

LeetCode:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

思路:美妙的思路,快慢指针隔n+1个结点,+1是因为要想找到删除的结点需要找到该节点的上一个结点才行。

ListNode dummyhead = new ListNode(-1);
            dummyhead.next = head;
            ListNode falstnode = dummyhead;
            //这里for是先将快指针送到第n结点的位置
            for(int i = 0;i<n+1;i++){
                falstnode = falstnode.next;
            }
            //慢指针和快指针同步,当快指针为null时结束。说明到头了
            ListNode slownode = dummyhead;
            while( falstnode != null){
                falstnode = falstnode.next;
                slownode = slownode.next;
            }
            
            slownode.next =slownode.next.next;
            return dummyhead.next;

LeetCode:160. 相交链表 - 力扣(LeetCode)

leetcode 最浪漫的一题

思路:简单来说相交链表,两个指针走的路是原本x+y+z,走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路

相交链表最重要的就是这个思路:当链表到尾部时,将尾部替换成另一个链表的头结点,另一条也是如此,这样,原本两个相交的链表的头指针走过的路就是2+3+3 == 3+3+2 !! wc

 代码如下

        ListNode curB = headB;
        while(curA != curB){
            if(curA.next == null && curB.next == null){
                return  null;
            }
            if(curA.next != null){
                curA =curA.next;
            }else
            {
                curA = headB;
            }
            if(curB.next != null){
                curB =curB.next;
            }else
            {
                curB = headA;
            }
        }
        return curA;

LeetCode:142. 环形链表 II - 力扣(LeetCode)

思路:第一步判断链表有没有环存在,用快慢指针来判断,之间隔一步即可,若有环,快慢指针会相遇;

   第二步 判断环点在什么位置,也是两个指针,一个头结点指针和一个相遇点指针,用数学知识可得,头结点指针和相遇点指针同时进行。最后一定会再次回到相遇点,那时候的相遇点指针指向的就是环的结点。

public ListNode detectCycle(ListNode head) {
        // 第一步用快慢指针判断有没有环存在
        ListNode slow = head ;
        ListNode fast = head;
        while(fast != null && fast.next != null){//判断快指针到尾部
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast){//有环
                //第二步:判断环的结点,因为从头结点和相遇结点同时出发,一定会再次回到相遇点,相遇点就是环的入口
                ListNode index1 = fast;
                ListNode index2 = head;
                while(index1!=index2){
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;

 

标签:结点,ListNode,cur,随想录,next,链表,节点,指针
From: https://www.cnblogs.com/lengbo/p/18029690

相关文章

  • day42 动态规划part4 代码随想录算法训练营 46. 携带研究材料- 一维数组写法
    题目:46.携带研究材料我的感悟:一维是二维的压缩理解难点:倒序遍历j因为每轮的数字是由左上决定的。遍历的时候,从右侧遍历,是不会影响左侧的。听课笔记:代码示例:defbag_problem(weight,value,bagWeight):#初始化dp=[0]*(bagWeight+1)fori......
  • day42 动态规划part4 代码随想录算法训练营 卡尔网46. 携带研究材料
    题目:卡尔网-46.携带研究材料我的感悟:有1个测试用例没通过。还要多练习理解难点:dp递推公式的由来,初始化的参数。听课笔记:代码示例:defbag_problem(weight,value,bagweight):#[1,3,4][15,20,30]4ifbagweight==1:index=weigh......
  • 在K8S中,worke节点如何加入K8S高可用集群?
    在Kubernetes(K8S)中,将一个Worker节点加入到高可用集群的过程与加入单Master集群大体相似,但需要注意的是,高可用集群中的Master通常是通过负载均衡器暴露服务端点的,这样无论哪个Master节点宕机,Worker节点都可以连接到活跃的Master节点。以下是加入高可用Kubernetes集群的具体步骤:1.......
  • 代码随想录 day61 每日温度 下一个更大元素 I
    每日温度单调栈的作用就是记录之前的元素好与当前元素比较从栈顶到栈底单调增找第一个第一个大元素单调减找第一个小元素栈内存的是数组下标而不是数组元素因为存元素还要会数组找元素是谁存下标可以直接用栈元素作为索引找数组元素下一个更大元素I跟每日温度......
  • 在K8S中,"节点亲和性"和"节点选择器"的区别在哪里?
    在Kubernetes(K8s)中,“节点选择器”(NodeSelector)和“节点亲和性”(NodeAffinity)都是用来指导Pod调度到合适节点的机制,但它们在功能和灵活性上有一定的区别:节点选择器(NodeSelector):是较早且较为基础的一种调度策略,用于简单匹配节点的标签(labels)。当在Pod的规范中定义了节点选择......
  • 数据链路(相邻节点传输数据帧)(计算机网络)
    信道:以传输媒介为基础的信号通道。数据链路层信道点对点信道:使用一对一的点对点通信方式广播信道:使用一对多的广播通信方式。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。从数据链路层看,H1到H2的通信可以由四段不同的链路层通信组......
  • linux内核链表 --20240225
    提起linux内核链表,首先一定得弄清楚的两个linux内核常用宏offsetof&&container_ofoffsetof宏#defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)宏解析:1、size_t在系统中一般指unsignedint,无符号整型2、(TYPE*)0,把0地址强制转换成type结构体类型的指针......
  • 代码随想录算法训练营第二天| 977.有序数组的平方
    第一题题解首先写了一个初步解,后续再想优化思路classSolution:defsortedSquares(self,nums:List[int])->List[int]:#sortbytheabsofvalueabs_min=10000abs_min_index=0foriinrange(len(nums)):if......
  • 【力扣】删除排序链表中的重复元素II
    题目描述思路这些链表的有序性使这些操作都不难写。前面在数组的题目里写过跳过重复元素的算法,这个和那个类似,用快慢指针写,但是由于这个是删除重复元素,所以我用了两个相邻的慢指针,左边的慢指针其实是为了保存真正的慢指针的上一个位置。代码如下:classSolution{public:......
  • 代码随想录算法训练营第二十七天| 93.复原IP地址 78.子集 90.子集II
    复原IP地址 题目链接:93.复原IP地址-力扣(LeetCode)思路:投降。在判断字符串是否合法这部分遇到了困难。classSolution{private:vector<string>result;//记录结果//startIndex:搜索的起始位置,pointNum:添加逗点的数量voidbacktracking(string&s,int......