链表_LeetCode_876_链表的中间节点
原题:给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
法一:遍历两次,第一次测出链表长度,第二次遍历至中间节点。
struct ListNode* middleNode(struct ListNode* head){ int c=1; struct ListNode* p=head; struct ListNode* q=head; while(p->next){ p=p->next; c++; } c=c/2; while(c){ q=q->next; c--; } return q; }
法二:遍历一次,将节点储存到数组中,一共有N个节点,则直接返回第N/2个节点。
法三:快慢指针
慢指针slow前进速度为1节点,快指针fast前进速度为2节点。则当fast到达链表末端时,slow到达链表中间节点。
该快慢指针模式将应用于今后若干场景,比较重要。
struct ListNode* middleNode(struct ListNode* head) { struct ListNode* slow = head; struct ListNode* fast = head; while (fast != NULL && fast->next != NULL) { slow = slow->next; fast = fast->next->next; } return slow; }
🛫️起飞

浙公网安备 33010602011771号