链表的中间结点
点击链接做题
思路1:
- 第一次循环:求链表总长度,计算中间结点的位置
- 第二次循环:根据中间节点的位置走到中间节点
思路2:快慢指针
先定义快慢指针
fast,slow
,都位于头节点慢指针每次往后走1步,快指针每次往后走2步。
奇数个结点时:当
fast->next == NULL
就没有必要往后走了,此时slow
也刚好指向中间节点偶数个结点时:当
fast
走到NULL
的时候,此时slow
也刚好指向中间节点
为什么快慢指针可以找到中间节点?
慢指针每次走一步,快指针每次走两步,当快指针走到链表的尾结点时,假设链表的长度为
n
快指针走的路程是慢指针的两倍,即
2*慢=快
此时慢指针走的路程就是
n/2
思路代码:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {ListNode* slow = head, *fast = head;//慢指针每次走1步,快指针每次走2步while(fast && fast->next){//不能写while(fast->next && fast)slow = slow->next;fast = fast->next->next;}//此时slow指向的结点刚好就是中间结点return slow;
}