一、两两交换链表中的节点
题目:两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
输入:head = [1,2,3,4] 输出:[2,1,4,3]
思路:
1、递归解法
经典递归求解,代码如下:
public ListNode swapPairs(ListNode head) {
//判断头和下一节点是否为空
if(head==null||head.next==null)
return head;
//记录head.next
ListNode next=head.next;
//递归求解的head.next.next赋给cur
ListNode cur=swapPairs(head.next.next);
//交换
next.next=head;
//连接
head.next=cur;
return next;
}
2.虚拟头节点
优先创建一个虚拟的头节点reList=new ListNode(0);
reList.next=head,虚拟头创建成功,过程如下图:
代码如下:
public ListNode swapPairs(ListNode head) {
ListNode reList=new ListNode(0);
reList.next=head;
ListNode prev=reList;
while(prev.next!=null&&prev.next.next!=null){
ListNode temp=prev.next.next;
prev.next=head.next;
head.next.next=head;
head.next=temp;
//向下进行
prev=head;
head=head.next;
}
return reList.next;
}
二、删除链表的倒数第N个节点
题目:删除链表倒数N节点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
思路:
快慢指针+虚拟头节点
直接上代码,
public ListNode removeNthFromEnd(ListNode head, int n) {
//创建一个虚拟头节点
ListNode nList=new ListNode(0);
nList.next=head;
ListNode slow=nList;
ListNode fast=nList;
//快指针始终比慢指针快n个节点
for (int i = 0; i < n; i++) {
fast=fast.next;
}
//一直到fast是最后一个节点
while(fast.next!=null){
fast=fast.next;
slow=slow.next;
}
//慢指针此时在要删除节点的前一个节点,直接让其指向删除节点的下一个节点
slow.next=slow.next.next;
//返回真是的链表头节点
return nList.next;
}
三、环形连边Ⅱ
题目:环形链表
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。
思路:
快慢指针
简单的来说,如果有环的话慢指针于快指针重合的时候就是环的开始
代码如下:
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;
}
总结
训练营第四天,今天周六,晚上才开始写,突然觉得链表没有一开始那么难和没有一点想法,继续加油。