1 反转链表
leetcode题目 24. 反转链表
定义链表 ListNode.java
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
反转链表实现:
public static ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next; // 先保存后继节点
cur.next = prev; // 后继指针指向前驱节点
prev = cur; // 前驱结点临时变量后移
cur = next; // 当前节点临时变量后移
}
return prev;
}
2 每k个一组反转链表
leetcode题目: 25. K 个一组翻转链表
public static ListNode reverseKGroup(ListNode head, int k) {
if (k <= 1) return head;
int count = 0;
ListNode node = head;
ListNode lastTail = null;
ListNode lastHead = head;
while (node != null) {
count++;
// 计数达到K个,处理链表反转
if (count % k == 0) {
ListNode nextTemp = node.next;
node.next = null;
ListNode newHead = reverseList(lastHead); // 反转链表,返回新头结点
if (lastTail != null) {
lastTail.next = newHead; // 新的链表尾lastTail 指向下一个待反转链表的头
}
if (count == k) head = newHead; // 第一个子链表的头结点作为返回值
lastTail = lastHead; // 保存已反转链表的尾部
lastHead.next = nextTemp; // 链接后面的链表
lastHead = nextTemp; // 指向后续的子链表的头结点
node = nextTemp; // node指针后移
continue; // 防止后面的指针移动跳过节点
}
node = node.next;
}
return head;
}