- 237 删除链表中的节点
先复制其他结点内容到当前结点,再删除其他结点,实现删除当前结点。
- 19 删除链表的倒数第N个节点
双指针法(链表):快指针先移动n+1位,慢指针再出发,然后快指针达到NULL位置时,慢指针就处于倒数第n+1个。
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy;
ListNode second = dummy;
// Advances first pointer so that the gap between first and second is n nodes apart
for (int i = 1; i <= n + 1; i++) {
first = first.next;
}
// Move first to the end, maintaining the gap
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
}
- 206 反转链表
迭代法:对每个结点做操作,一直迭代到尾结点。
递归法:空链表或单结点链表跳出递归,递归当前结点的后续链表,将当前结点接在反转后的后续链表尾部,并设当前结点的next为NULL值。
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) return head;
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
- 234 回文链表
双指针法(链表)II:快指针每次走两个结点,慢指针只走一个结点,最后快指针到达NULL位置时,慢指针就位于len/2的位置。
ListNode fast = head;
ListNode slow = head;
// 根据快慢指针,找到链表的中点
while(fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
slow = slow.next;
- 2 两数相加
当存在一方结点不足时,可以把该加数当作0。
- 328 奇偶链表
双链表法:将奇偶结点分别连成两个链表,然后再把偶链表接到奇链表之后。
- 141 环形链表
双指针法(奇偶指针)解决。
- 160 相交链表
转化为环形链表问题解决。
计算两链表长度,截去多余结点后再平行比较。