Given a non-empty, singly linked list with head node head
, return a middle node of linked list.
If there are two middle nodes, return the second middle node.
Example 1:
Input: [1,2,3,4,5]
Output: Node 3 from this list (Serialization: [3,4,5])
The returned node has value 3. (The judge's serialization of this node is [3,4,5]).
Note that we returned a ListNode object ans, such that:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, and ans.next.next.next = NULL.
Example 2:
Input: [1,2,3,4,5,6]
Output: Node 4 from this list (Serialization: [4,5,6])
Since the list has two middle nodes with values 3 and 4, we return the second one.
Note:
The number of nodes in the given list will be between 1
and 100
.
找到中间结点,并返回。
1. 第一种方法是用计数器遍历链表得到链表长度,然后除二取整,再用循环直接迭加到中间结点。
1 struct ListNode* middleNode(struct ListNode* head) { 2 if(!head) return NULL; 3 struct ListNode *current=head; 4 int count=0; 5 while(current){ 6 current=current->next; 7 count++; 8 } 9 count/=2; 10 current=head;//重新赋值多次,不然current是NULL报错 11 while(count){ 12 current=current->next; 13 count--; 14 } 15 return current; 16 }
2. 第二种方法是用两个指针,快的走两步,慢的走一步,当快的走完的时候,慢的刚好停在中间。
1 struct ListNode* middleNode(struct ListNode* head) { 2 if(!head) return NULL; 3 struct ListNode *slow=head,*fast=head; 4 while(fast && fast->next){ 5 slow=slow->next; 6 fast=fast->next->next; 7 } 8 return slow; 9 }