题目描述:给定一个带有头结点 head
的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例:
- 链表:1->2->3->3->4->4->5
- 输出:3->4->4->5
- 链表:1->2->3->3->4->4
- 输出:3->4->4
方法1.求链表长度,然后除以2就是链表从头到一半所遍历的次数。
class Solution {
public ListNode middleNode(ListNode head) {
int length = 0;
for(ListNode len = head;len != null;len = len.next){
length++;
}
int midLen = length / 2;
for(int i = 0;i < midLen;i++){
head = head.next;
}
return head;
}
}
方法2.双结点法。 定义两个结点,一个慢的一次移动一步,一个快的一次移动两步。直至快的移动到链表末尾。
class Solution {
public ListNode middleNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null){
if(fast.next == null){
break;
}
fast = fast.next;
slow = slow.next;
fast = fast.next;
}
return slow;
}
}