LeeCode刷题指南|链表技法整理

57 阅读1分钟

1 寻找中间节点

在链表中找中间节点非常常见,但是考虑到原链表的奇偶问题、边界问题,可能存在一些问题。

private ListNode middleNode(ListNode head) {
    ListNode slow = head, fast = head;
    while(fast.next != null && fast.next.next != null) {
    //假如是第n次移位,slow的位置是n+1,fast是2n+1
    //结束循环时,链表的长度是2n+1或是2n+2,对应的中点是n+2,此时的slow是n+1
    //链表长度是奇数时要向上取整
        slow = slow.next;
        fast = fast.next.next;
    }
    //下一个节点是中间节点
    ListNode midNode = slow.next;
    slow.next = null;
    return midNode;
}

2 反转链表

常见,需要三个指针,一个提前保存下个节点的信息。

private ListNode reverseList(ListNode head) {
        ListNode pre = null, cur = head;
        while(cur != null) {
            ListNode post = cur.next;
            cur.next = pre;
            pre = cur;
            cur = post;
        }
        return pre;
    }