day04

Leetcode24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)
image

//
class Solution{
	public ListNode swapParis(ListNode head){
		listNode dummyhead=new listNode(-1,head); //定义一个虚拟头结点  指向head             (1)设置虚拟头节点
		ListNode cur =dummyhead;   //不直接用dummyhead 来操作 
		while(cur.next!=null&&cur.next.next!=null){   //必须是&& 因为只有 成对的两个节点才会进行交换  (2)设置两个节点来缓存
			ListNode temp=cur.next.next.next;  // 用来 保存 需要交换的两个节点之后的 节点
			ListNode pred=cur.next;  //保存 第一个要交换的节点;
			cur.next=pred.next;
			cur.next.next=pred;
			pred.next=temp;   //三步 交换  两个节点顺序
			cur=cur.next.next  //cur 直接向后遍历两个位置
		}
	}
}
//方法2  递归法  [解析链接](https://lyl0724.github.io/2020/01/25/1/ "解析链接")
class Solution{
	public ListNode swapParis(ListNode head){
		if(head==null||head.next==null){
		return head;
		}
		ListNode pre=head.next;
		head.next=swapParis(pre.next);
		pre.next=head;
		return pre;
	}
}

leetcode 19删除链表倒数第N个节点

image

class Solution{
	public ListNode removeNthFromEnd(ListNode head, int n) {
		LinkNode dummyNode=new LinkNode(-1 ,head); //设置虚拟头结点
		ListNode fast=dummyhead;
        ListNode slow =dummyhead;  //设置两个指针,让一个先走n,这样两个指针就一直保持n的距离,然后两个一起向后走,快的那个走到底,此时慢的那个就停在了倒数第n个的位置。(应该让慢的停在要删除的前一个位置)	
		for(int i=0;i<n;i++){
			fast=fast.next;
		}
		while(fast.next!=null){
			fast=fast.next;
			slow=slow.next;
		}
		slow.next=slow.next.next;
		return dummyNode.next;
	}



}

142. 环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。
image

题目分为两个步骤 1:先判断是否有环 2找到环的入口
设置 一个 快慢指针 fast 速度为2, slow速度为1
如果有环, 那么 fast和slow一定会在环里面相遇
假设环的入口 为 a , 入口到相遇的位置为b
slow 走到了b, 走了 a+b的路程
又因为fast是slow 速度的两倍 所以 fast 走了2*(a+b)
所以 slow 绕环继续走 a+b 又回到了b点,所以环剩下的长度 也等于 a
可以利用这个条件 让一个节点 从头开始遍历 ,另一个节点从相遇的地方开始遍历,速度相同,路程也相同,那么相遇的地方就是环的入口了。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fastNode=head;
        ListNode slowNode=head;
        boolean hasCycle=false;

        while(fastNode!=null&&fastNode.next!=null && fastNode.next.next!=null){
            fastNode=fastNode.next.next;
            slowNode=slowNode.next;
            if(fastNode==slowNode){
                hasCycle=true;
                break;
            }
        }
        if(hasCycle){
            ListNode cur = head;
            while(cur!=slowNode){
                cur=cur.next;
                slowNode=slowNode.next;
            }
            return cur;
        }else{
            return null;
        }        
    }
}

///面试题 02.07. 链表相交   难度不大 有点麻烦
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode a=headA;
        ListNode a1=headA;
        ListNode b=headB;
        ListNode b1=headB;
        int lengthA=0,lengthB=0;
        while(a!=null){
            lengthA++;
            a=a.next;
        }
        while(b!=null){
            lengthB++;
            b=b.next;
        }
        if(lengthB>lengthA){
            int temp=lengthA;
            lengthA=lengthB;
            lengthB=temp;
            ListNode tmepNode=a1;
            a1=b1;
            b1=tmepNode;
        }
        int lengthGap=lengthA-lengthB;
        while(lengthGap-->0){
            a1=a1.next;
        }
        while(a1!=null){
            if(a1==b1){
                return a1;
            }
            a1=a1.next;
            b1=b1.next;
        }
        return null;
       
    }
}

posted on 2022-09-24 21:38  你是千堆雪我是长街7  阅读(114)  评论(0)    收藏  举报

导航