反转链表(leedcode-206)
- 创建一个 newHead,在头节点逐个插入
public ListNode reverseList1(ListNode head) {
ListNode newHead = null;
ListNode p1 = head, p2 = head;
while(p1 != null) {
p2 = p1.next;
p1.next = newHead;
newHead = p1;
p1 = p2;
}
return newHead;
}
K 个一组翻转链表
- 使用迭代,每 k 个一组
public ListNode reverseKGroup(ListNode head, int k) {
ListNode p1 = head, p2 = head;
for(int i = 0; i < k; i++) {
if(p2 == null) return head;
p2 = p2.next;
}
ListNode newHead = reverse(p1, p2);
p1.next = reverseKGroup(p2, k);
return newHead;
}
// [start, end)
public ListNode reverse(ListNode start, ListNode end) {
ListNode head = null;
ListNode p1 = start, p2 = start;
while(p1 != end) {
p2 = p1.next;
p1.next = head;
head = p1;
p1 = p2;
}
return head;
}
回文单链表
- 递归思想
/* 倒序打印单链表中的元素值 */
void traverse(ListNode head) {
if (head == null) return;
traverse(head.next);
// 后序遍历代码
print(head.val);
}
- 寻找链表中心节点,反转其中一部分
判断链表是否有环 / 环的起始位置
两链表的公共节点
算法思想
- 用两指针分别遍历 A 和 B,当各自遍历完后转到其他首节点
- 对于不相交的节点,会最后会同时指向 null
证明
- 取链表 A 与 链表 B 单独部分长度分别为 a 和 b,公共部分长度 c:
- 相交:a + c + b = b + c + a
- 不相交:a + b = b + a