题目:
给定一个头结点为 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
方法一:
思路:
设长度为N,N / 2
例如,
5 / 2 = 2 -->从头结点开始走两步到中间点
6 / 2 = 3 -->从头结点开始走三步到中间点
无论链表是奇数还是偶数,只要拿到链表长度,从head开始开始走N / 2 步恰好走到中间节点。
代码:
public ListNode middleNode(ListNode head) {
int count = 0;
for (ListNode x = head; x != null; x = x.next) {
count++;
}
ListNode middle = head;
int middleIndex = count / 2;
for (int i = 0; i < middleIndex; i++) {
middle = middle.next;
}
return middle;
}
方法二:
快慢指针法
思路:
引入两个引用,让一个引用先走或者是多走几步,e.g. left 一次走两步, right 一次走一步,
当 left 走到 null 或是 left.next == null ,right 恰好走到中间位置。
public ListNode middleNode_pointer(ListNode head) {
ListNode right = head;
ListNode left = head;
while (left != null && left.next != null) {
left = left.next.next;
right = right.next;
}
return right;
}