判断链表中是否有环
链表中环的入口结点
删除链表的节点
删除链表的中间节点
删除链表的倒数第n个节点
删除链表中重复的结点
删除有序链表中重复的元素-I(保留重复元素)
删除有序链表中重复的元素-II(不保留重复元素)
重排链表
反转链表
链表内指定区间反转
链表中的节点每k个一组翻转
合并两个排序的链表
合并k个已排序的链表
划分链表
两个链表的第一个公共结点
链表相加(一)
链表相加(二)
设计LRU缓存结构
判断一个链表是否为回文结构
旋转链表
链表的奇偶重排
复杂链表的复制
两两交换链表的节点
二叉树展开为单链表
链表中倒数最后k个结点
对链表进行插入排序
链表的中间结点
环形链表的约瑟夫问题
从尾到头打印链表
连续子链表最大和
排序奇升偶降链表
给单链表加一
无环单链表插值
判断链表中是否有环
环形链表
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
注意事项
- 快指针要比慢指针多走一步
代码
链表中环的入口结点
环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
说明:不允许修改给定的链表。
注意事项
- 如果不提前走一步,那么从循环出来的时候需要判断是不是走到末尾出来的。
代码
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head==null) return null;
ListNode first=head;
ListNode second=head;
while(first!=null){
second=second.next;
if(first.next==null){
return null;
}else{
first=first.next.next;
}
if(first==second){
break;
}
}
if(first==null) return null;
second=head;
while(first!=second){
first=first.next;
second=second.next;
}
return first;
}
}
删除链表的节点【节点值相等】
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
示例 1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if(head==null){
return null;
}
ListNode dummy = new ListNode(-1);
dummy.next=head;
ListNode cur=dummy;
while(cur!=null){
if(cur.next==null){
return head;
}
ListNode next = cur.next;
if(next.val==val){
cur.next=next.next;
next.next=null;
return dummy.next;
}
cur=cur.next;
}
return head;
}
}
删除链表的节点【节点】
删除链表的中间节点
给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。
长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x 的最大整数。
对于 n = 1、2、3、4 和 5 的情况,中间节点的下标分别是 0、1、1、2 和 2 。
例如
输入:head = [1,2,3,4]
输出:[1,2,4]
解释:
上图表示给出的链表。
对于 n = 4 ,值为 3 的节点 2 是中间节点,用红色标注。
class Solution {
public ListNode deleteMiddle(ListNode head) {
//无节点和一个节点的被我们跳过了
if(head==null) return null;
ListNode dummy = new ListNode(-1);
dummy.next=head;
ListNode first=head;
ListNode second=dummy;
while(first!=null&&first.next!=null){
first=first.next.next;
second=second.next;
}
second.next=second.next.next;
return dummy.next;
}
}
删除链表的倒数第n个节点
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 :
输入:head = [1], n = 1
输出:[]
示例 :
输入:head = [1,2], n = 1
输出:[1]
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head==null) return null;
ListNode dummy= new ListNode(-1,head);
ListNode first=head;
ListNode second=dummy;
for(int i=0;i<n;i++){
if(first==null) return head;
first=first.next;
}
while(first!=null){
first=first.next;
second=second.next;
}
second.next=second.next.next;
return dummy.next;
}
}
删除有序链表中重复的元素-I(保留重复元素)
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示