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;
}