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