给你单链表的头结点 head
,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
示例:
思路分析: 要想找到中间节点首先需要遍历整个链表确定链表中有多少个节点,所以定义一个count来记录有多少个节点,然后开始遍历链表,然后第二次遍历链表输出中间节点,但如何遍历输出我没有想出来,经借鉴后发现只需要第二次用for循环,需要注意的是重置头结点,因为第一次遍历p已经指向尾部
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func middleNode(head *ListNode) *ListNode {
p := head
var count int
if p.Next != nil {
count++
p = p.Next
}
p = head
for i:= 1; i <= count/2; i++{
p = p.Next
}
return p
}
还有一种解法:快慢指针法,即快指针一次走两步,慢指针一次走一步。此种方法下我们需要考虑的是快指针什么时候停能够使慢指针指向中间节点,经画图后发现当指针所在的当前节点的下一个节点为空时,快指针就要停止
func middleNode(head *ListNode) *ListNode {
newHead := &ListNode{Next: head}
slow, fast := newHead, newHead
for fast != nil && fast.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
if fast == nil {
return slow
}
return slow.Next
}