第25题:K 个一组翻转链表
主体函数
举例:1>2>3>4>5 k=3
ListNode end=prev; for(int i=0;i<k&&end!=null;i++){ end=end.next; }
先让end和prev相等
然后遍历,让end往下走
if(end==null)break;
end到头了,就断开
ListNode nextgroup=end.next;
给断开后的起名叫nextgroup
ListNode start=prev.next; end.next=null;//把划分好的单独切了出来 prev.next = reverse(start);
翻转以K为准划分好的那段
start.next = nextgroup;
翻转前的 start = 1,现在变成了这一组的尾巴。让它指向下一组的开头
prev = start;
现在这一组已经翻转完成,prev 要移动到这一组的尾巴,作为下一组翻转时的「前置节点」。
翻转逻辑:
举例:1>2>3>4
prev=null ,curr=head(1)
while(curr!=null){
ListNode next=curr.next(next=2) //断开,保存后面的节点
curr.next=prev; //改变指针的方向
现在:
1>null
2>3>4>null //断开后的结果
prev=curr; //prev前进。prev=1
curr=next;//curr前进。curr=2
接着进行第二次循环
ListNode next=curr.next(next=3)
curr.next=prev; //curr=2,让curr.next=1(2>1)
现在:
2>1>null;
3>4null;
prev=curr; //prev前进。prev=2
curr=next;//curr前进。curr=3
第三次循环
ListNode next=curr.next(next=4)
curr.next=prev; //curr.next=2
现在:
3>2>1>null
4>null
prev=curr; 3
curr=next; 4
第四次循环
ListNode next=curr.next;
curr.next=prev;
现在:
4>3>2>1>null
不满足循环条件curr!=null,退出循环
第61题:旋转链表
1.计算链表长度
遍历链表,得到长度为n
注意:如果k>=n,其实就是k%n次旋转
2. 找到新头和新尾
新尾节点应该是 第 (n - k) 个节点。
新头节点就是新尾的下一个节点。
例子:
n = 5, k = 2
新尾 = 第 5-2=3 个节点(值是 3)
新头 = 3.next = 4
3. 改指针
先断开在新尾的位置。
把原来的尾巴(值 5)指向原来的头(值 1),形成一个环。
1 → 2 → 3 → 4 → 5
↑ ↓ ------------> 4 → 5 → 1 → 2 → 3
└───────────┘
这里4也会被5带过去,因为4的next指向是5
k % n 的性质
如果 k < n 那么 k % n = k,等于什么都没做。
如果 k >= n 那么 k % n 会自动把它缩小到 [0, n-1] 的范围内。
所以 k = k % n; 一行代码,就已经同时处理了 k < n 和 k >= n 两种情况。
举例
假设 n = 5:
k = 2 → k % n = 2
k = 5 → k % n = 0(旋转一整圈,不需要动)
k = 12 → k % n = 2
k = 0 → k % n = 0
可以看到,取模运算天然就包含了 if (k >= n) 的逻辑。
第82题:删除排序链表中的重复元素||
while(curr!=null){ boolean duplicate=false;
假设没有重复,如果有重复为true
if (duplicate) {
// duplicate 是 true 执行这里
} else {
// duplicate 是 false 执行这里
}