算法 链表的中间结点

给你单链表的头结点 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
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值