面试经典150题0527
Leetcode025 K个一组反转链表
先判断剩余链表节点的个数是否够k个,如果够,则通过循环依次向后反转k个节点;如果不够,则直接返回即可。
连续反转k个节点的方法和092 反转链表Ⅱ
相同。
- 链表分为三个部分:已反转、正在反转、未反转
ptr
为已反转链表中的最后一个节点,pre
和curr
用来控制当前正在反转的两个节点,nxt
用来暂存curr.next
,防止下一个节点的丢失。- 当
k
个节点全部结束时,使用ptr.next.next = curr
和未反转链表进行拼接,使用ptr.next = pre
和已反转的链表进行拼接。同时使用tmp
暂存反转后链表的最后一个节点作为下一轮反转的ptr
public static ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0, head);
ListNode pre = dummy;
ListNode end = dummy.next;
while (end != null){
// 定位待反转链表的最后一个节点
int num = 0;
for (; num < k && end != null; num++) {
end = end.next;
}
if(num < k){
break;
}
// 将k个节点进行反转
ListNode curr = pre.next;
ListNode ptr = pre;
for (int i = 0; i < k; i++) {
ListNode nxt = curr.next;
curr.next = pre;
pre = curr;
curr = nxt;
}
ListNode tmp = ptr.next;
ptr.next.next = curr;
ptr.next = pre;
pre = tmp;
}
return dummy.next;
}
Leetcode019 删除链表的倒数第N个节点
- 遍历一遍链表,记录节点个数为
cnt
- 那么删除倒数第n个节点,等价于删除第
cnt - n
个节点 - 遍历到待删除节点的前一个节点,直接将指针指向待删除节点的下一个节点
public static ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0, head);
ListNode curr = dummy;
int cnt = 0;
while (curr.next != null){
cnt++;
curr = curr.next;
}
int k = cnt - n;
ListNode pre = dummy;
for (int i = 0; i < k; i++) {
pre = pre.next;
}
curr = pre.next;
pre.next = curr.next;
return dummy.next;
}
curr = pre.next;
pre.next = curr.next;
return dummy.next;
}