目录
题目描述:
给你单链表的头结点 head
,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
题目分析:
寻找中间节点这道题原理就是通过1/2总长度,对于我来说一开始想到的方法一 就是先计算内部有多少个节点,然后进行除以二,得到中间节点数后,进行遍历到对应的中间节点(本人有点笨,只能想到这种方法了)。通过向大佬学习,我发现一个更加好用的方法,思路二 就是快慢指针,这个快慢指针就是一个fast指针每次走两步,另一个low指针每次走一步,等fast出界时,low就是中间指针,这个方法是个好方法思路简单,代码也好写,就是难想出来哈哈哈。
代码解决:
思路一:
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
ListNode* n1, * n2;
n1 = n2 = head;
int count = 0;
//遍历计算链表长度
while (n1)
{
n1 = n1->next;
count++;
}
//移动到中间链表
count = count / 2;
while (count)
{
n2 = n2->next;
count--;
}
return n2;
}
思路二:
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
ListNode* fast = head;
ListNode* low = head;
while (fast != NULL && fast->next != NULL)
{
fast = fast->next->next;
low = low->next;
}
return low;
}