链表的中间结点
- 返回链表的中间结点,如果有两个结点,就需要返回第二个中间的结点
思路一:利用快慢指针进行求解
本题可使用快慢双指针解决:
- 初始时两个指针均指向头指针。
- 如果快指针为空或者快指针的next为空(因为结点的个数可能为偶数个也可能为奇数个),那么此时慢指针即为答案,移动结束。
- 每轮移动,快指针需要移动两次,慢指针需要移动一次。跳转步骤二。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* middleNode(ListNode* head)
{
//利用快慢指针进行求解
ListNode *fast=head;
ListNode *slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
};
思路二:利用单个指针进行求解
- 我们可以对链表进行两次遍历。第一次遍历时,我们统计链表中的元素个数 count;第二次遍历时,我们遍历到第 count/2 个元素(链表的首节点为第 0 个元素)时,将该元素返回即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* middleNode(ListNode* head)
{
//利用单个指针进行求解,第一步先遍历求得链表中结点的个数
ListNode *cur=head;
int count=0;
while(cur)
{
cur=cur->next;
count++;
}
int k=0;
cur=head;
while(k<count/2)
{
k++;
cur=cur->next;
}
return cur;
}
};