【发布时间】:2023-02-11 22:28:26
【问题描述】:
Finding middle element in a linked list
给定一个包含 N 个节点的单链表。 任务是找到链表的中间部分。例如,如果链表是 1->2->3->4->5,则链表的中间节点为3。 如果有两个中间节点(以防万一,当 N 为偶数时),打印第二个中间元素。 比如给定的链表是1->2->3->4->5->6,那么链表的中间节点就是4。
示例 1:
输入: 链表:1->2->3->4->5 输出:3 解释: 链表的中间是 3。 示例 2:
输入: 链表:2->4->6->7->5->1 输出:7 解释: 链表的中间是 7。 你的任务: 任务是完成 getMiddle() 函数,该函数将头引用作为唯一参数,并应返回链表中间节点的数据。
预期时间复杂度:O(N)。 预期辅助空间:O(1)。
约束: 1 <= N <= 5000
class Solution{
public:
/* Should return data of middle node. If linked list is empty, then -1*/
int getMiddle(Node *head)
{
Node* fast = head;
Node *slow = head;
if (head != NULL){
while(fast->next != NULL && fast != NULL) //here
{
fast = fast->next->next;
slow = slow->next;
}
}
return slow->data;
}
};
// Runtime Error: Segmentation Fault (SIGSEGV)
class Solution{
public:
/* Should return data of middle node. If linked list is empty, then -1*/
int getMiddle(Node *head)
{
Node* fast = head;
Node *slow = head;
if (head != NULL){
while(fast != NULL && fast->next != NULL) //here
{
fast = fast->next->next;
slow = slow->next;
}
}
return slow->data;
}
};
// Problem Solved Successfully
【问题讨论】:
-
&&从左到右选中。如果fast == NULL、fast->next不合法并崩溃,则必须在确保fast不为空后进行检查。 -
请为您的两个示例提供minimal reproducible example。就像现在一样,它们不能被编译用于内省。
标签: c++ linked-list