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

//
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个节点

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 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。

题目分为两个步骤 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) 收藏 举报
浙公网安备 33010602011771号