给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为LeetCode中写的代码)

//第一次尝试:
//方法一:做两次循环,第一次计数有多少个节点,记为count;第二次循环获取到第count/2+1个节点的数据;
//方法二:快慢指针,设置两个指针fast、slow,初始时都指向首节点,然后fast每次走两步,slow每次走一步,当fast走到链表结尾,slow正好指向中间的节点,这样一次循环就可以做到
struct
ListNode* middleNode(struct ListNode* head){ //常规做法,两次循环 if(head->next == NULL){ return head; } struct ListNode* node = head;
//第一次循环计数count
int count = 0; while(node){ node = node->next; count++; }
//找到中间位置 count
= count/2 + 1; while(count > 1){ head = head->next; count--; } return head; //快慢指针法 struct ListNode* fast = head; struct ListNode* slow = head; while(fast != NULL&&fast->next != NULL){
//快指针一次走两步,慢指针一次走一步 slow
= slow->next; fast = fast->next->next; } return slow; }