两两交换链表中的节点-day04

两两交换链表中的节点
题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/solutions/444474/liang-liang-jiao-huan-lian-biao-zhong-de-jie-di-91/
思路:新建头结点,保存第1结点,第2个结点,第3个结点的地址值;
条件:cur.next!=null && cur.next.next!=null
只要满足上面条件,重复下面的操作
头结点.next指向第2个结点;第2个结点.next指向第1结点;第1个结点.next指向第3个结点
return 头结点.next指向第2个结点
代码:
public ListNode swapPairs(ListNode head) {
ListNode dumyhead=new ListNode(-1);//新建一个结点
dumyhead.next=head; //dumyhead作为头结点
ListNode cur=dumyhead;
ListNode temp;
ListNode fistnode;
ListNode secondnode;
while(cur.next!=null && cur.next.next!=null){
//第一次循环 temp保存第三个结点的地址值,firtnode 第1个,secondnode第2个
temp=cur.next.next.next;
fistnode=cur.next;
secondnode=cur.next.next;
cur.next=secondnode;//cur作为虚拟头结点,执行第2结点
secondnode.next=fistnode;//原来第2个结点,指向第1个结点
fistnode.next=temp;//=指向第3个结点
cur=fistnode;//cur作为新虚拟头结点
}
return dumyhead.next;
}

19. 删除链表的倒数第 N 个结点
题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
思路: 1. 得到链表的个数
2. 得到要删除结点的前一个结点的地址值
3. cur.next=cur.next.next
代码:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy=new ListNode(0,head); //新建一个结点,作为当前链表的头结点
int length=getLength(head); //获得结点的长度
ListNode cur=dummy;//cur指向当前结点
for(int i=0;i<length-n;i++){
cur=cur.next;//循环解释,执行被删除结点的前一个结点
}
cur.next = cur.next.next;
ListNode ans = dummy.next;
return ans;
}
public int getLength(ListNode head){
int length=0;
while(head!=null){
length++;
head=head.next;
}
return length;
}

面试题 02.07. 链表相交
题目链接: https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/
思路:考虑构建两个节点指针 A​ , B 分别指向两链表头节点 headA , headB ,做如下操作:

指针 A 先遍历完链表 headA ,再开始遍历链表 headB ,当走到 node 时,共走步数为:
a+(b−c)
指针 B 先遍历完链表 headB ,再开始遍历链表 headA ,当走到 node 时,共走步数为:
b+(a−c)
如下式所示,此时指针 A , B 重合,并有两种情况:

a+(b−c)=b+(a−c)
若两链表 有 公共尾部 (即 c>0 ) :指针 A , B 同时指向「第一个公共节点」node 。
若两链表 无 公共尾部 (即 c=0 ) :指针 A , B 同时指向 null

代码:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode A=headA,B=headB;
while(A!=B){
A=A!=null?A.next:headA;
B=B!=null?B.next:headB;
}
return A;
}

142. 环形链表 II
题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/
思路: 通过快慢指针的方式,如果单链表有环存在,快慢指针一定会在环内的某个结点相遇,此时定义一个新的结点pre指向head,pre和慢指针移动速度一致,二者一定会在入环点相遇。(数学公式得到的)
代码:
public ListNode detectCycle(ListNode head) {
if(headnull){
return head;
}
ListNode slow=head,fast=head;
while(fast!=null){
slow=slow.next;
if(fast.next!=null){
fast=fast.next.next;
}else{
return null;
}
if(fast
slow){
ListNode ptr = head;
while (ptr != slow) {
ptr = ptr.next;
slow = slow.next;
}
return ptr;

        }
    }
    return null;
}
posted @ 2026-01-18 19:13  whq001  阅读(1)  评论(0)    收藏  举报