代码随想录算法训练营第四天 java : 24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交,142环形链表II

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

题目链接

本题思路

这图画的太规整了
在这里插入图片描述
这是我画的在这里插入图片描述

需要注意的点

  • 设置虚拟头节点
 ListNode dummNode =new ListNode(0);
 dummyNode.next=head;
 ListNode cur=dummyNode;
  • cur指针一定要指向交换两指针的前一个节点
  • 最前面的合理性判断需要考虑链表的长度为奇数还是偶数
    奇数的话 两两交换会剩下一个 总不能和null 交换所以 所以
    循环截止条件cur.next.next =null;
    偶数的话 就不用在乎了 cur.next=null;
 while(cur.next!=null && cur.next.next!=null)
 // 这里前后是有区别的,如果后者放到
// 前面会出现空指针报错
 
  • 两两交换逻辑
ListNode temp =cur.next;
ListNode temp1=cur.next.next.next;
//由cur->2节点
cur.next= cur.next.next;
//由2节点转向1节点
temp= cur.next;
//由1节点到3节点
temp1= temp.next;
//cur的后移考虑啊到每次都在交换节点之前
cur=cur.next.next

AC 代码

class Solution {
    public ListNode swapPairs(ListNode head) {
           ListNode  dummy =new ListNode(0);
           ListNode cur=dummy;
           dummy.next=head;
           while( cur.next!=null&& cur.next.next!=null)
           {
               ListNode temp= cur.next;
               ListNode temp1= cur.next.next.next;
               cur.next= cur.next.next; //步骤一
               cur.next.next=temp;  //步骤二
               temp.next =temp1; //步骤三
               cur=cur.next.next; // cur移动两位,准备下一轮交换

           }
           return dummy.next;
    }
}

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

题目链接

在这里插入图片描述

需要注意的点

  • FastIndex 先走n+1步 正好是链表中导数第n个位置,
    SlowIndex 和FastIndex 同时出发直到fastindex到头,正好slowIndex在 删除数前一个
    可以作为操作数
ListNode dummyNode= new ListNode(0);
dummyNode.next =head; //将虚拟头节点指向head

//生成快慢指针
ListNode fastIndex =dummyNode;
ListNode slowIndex =dummyNode;
//只要快慢指针相差n个节点即可
for(int i=0;i<n ;i++)
{
 fastIndex =fastIndex.next; //
 }
 while(fastIndex.next!= null){
    fastIndex =fastIndex.next;
    slowIndex = slowIndex.next;
}
//此时slowIndex 的位置就是删除元素的前一个位置。
//具体情况课自己画一个链表长度为3的图来模拟代码来理解
slowIndex.next=slowIndex.next.next;
return dummyNode.NEXT;  

今天跨年,还在敲代码 呜呜呜 下面是AC代码

AC代码

>  public ListNode removeNthFromEnd(ListNode head, int n) {
      ListNode  dummy = new ListNode(0);
      dummy.next = head;
      ListNode FastIndex=dummy;
      ListNode SlowIndex=dummy;
      for(int i=0;i<n+1;i++)  //因为fastIndex
      {
           FastIndex=FastIndex.next;
      }
      while(FastIndex!=null)
      {
          FastIndex=FastIndex.next;
          SlowIndex=SlowIndex.next;
      }
      
         SlowIndex.next =SlowIndex.next.next;
         return dummy.next;

    }
}

Leetcode面试题 02.07. 链表相交

题目链接

这个略了

Leetcode 142环形链表II

题目链接

难点:

  • 如何判断有环 (通过双指针方式来判断)
  while( fast!=null &&  fast.next!=null)
  { 
     fast=fast.next.next;  //
     slow = slow.next;
  } 
  if(fast==slow)
  {
   index1 = fast ;// slow也可以 这里是相遇得地方 一会附上我画得图
   index2 =head ;
   }
   

在这里插入图片描述

  • 如何找到入口点
    通过上面已经定义得 index1 和index2来找 不过为什么嘛 这里需要数学推导
    从图中看到 X、Y、Z ;

慢指针slow的轨迹为 x+y, 快指针fast的轨迹为 x+y+n(y+z)
由于slow每次移动都是一步 ,fast 是两步 如下图推导

在这里插入图片描述

while(index1 != index2){
   index1 =index1.next;
   index2 =index2.next;
}

return indext2; // 出口 为Z


return null;  //没有找到返回空指针

AC代码

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;
    }

今日收获

今天听了一段 罗振宇的时间的朋友 他讲到 博尔赫斯的一段话

一朵玫瑰正马不停蹄地成为另一朵玫瑰,你是云、是海、是忘却,你也是你曾经失去的每一个你。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值