LeetCode-876. 链表的中间结点 C语言

876. 链表的中间结点


给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。


示例 1:

输入:[1,2,3,4,5]

输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.



思路:

定义一对快慢双指针。fast走两步,slow走一步。
LeetCode-876. 链表的中间结点 C语言_第1张图片

当fast到达尾部,slow指向的就是链表中间元素。
LeetCode-876. 链表的中间结点 C语言_第2张图片

以上是链表元素为单数的情况。如果为双数,情况如下。

当fast为NULL,slow指向的就是下中位数。

结束遍历链表的条件为链表最后一个元素不为NULL,并且数组最后元素的next不为NULL。

LeetCode-876. 链表的中间结点 C语言_第3张图片

代码示例


struct ListNode* middleNode(struct ListNode* head) {

	//定义快慢双指针。
	struct ListNode* slow = head;
	struct ListNode* fast = head;

	//结束遍历链表的条件为链表最后一个元素不为NULL,并且数组最后元素的next不为NULL。
	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
	}

	//遍历结束slow指针指向中位数,
	return slow;

}

你可能感兴趣的:(LeetCode-876. 链表的中间结点 C语言)