美文网首页
求链表的中间节点

求链表的中间节点

作者: 云飞扬1 | 来源:发表于2020-02-20 22:47 被阅读0次

给定一个单向链表,怎么找到该链表的中位节点?

可以使用快慢指针,定义 2 个指针变量,慢指针移动步数为 1,快指针移动步数为 2,当快指针移动到链表尾部时,慢指针就恰好指向中位节点了。

代码如下(kotlin编写):

/**
 * 链表数据结构
 */
class Node constructor(val data: Char) {
    var next: Node? = null

    override fun toString(): String {
        val sb = StringBuilder()
        sb.append(data)
        var tmp: Node? = next
        while (tmp != null) {
            sb.append(tmp.data)
            tmp = tmp.next
        }
        return sb.toString()
    }
}

//为了测试方便,将字符转换为链表来存储
fun toLinkedListStr(str: String?): Node? {
    if (str.isNullOrEmpty())
        return null
    var head: Node? = null
    var next: Node? = null
    for (ch in str) {
        val node = Node(ch)
        next?.next = node
        next = node
        if (head == null) {
            head = node
            next = node
        }
    }
    return head
}

fun findMiddleNode(head: Node?): Node? {
    head ?: return null
    head?.next ?: return head

    var fast: Node? = head
    var slow: Node? = head
    while(fast?.next != null) {
        fast = fast?.next?.next
        slow = slow?.next
    }
    //此时 fast 指针如果不为空,则链表长度为奇数个,slow 指针刚好指向链表的正中间节点
    //如果 fast 指针为空,则链表长度为偶数个,slow 指针指向的是链表长度一半的后一个节点
    return slow
}

fun main() {
    val str1 = toLinkedListStr("abcde")
    println("$str1 的中位节点是:${findMiddleNode(str1)?.data}")
    println(findMiddleNode(toLinkedListStr(""))?.data)
    println(findMiddleNode(toLinkedListStr("a"))?.data)
    println(findMiddleNode(toLinkedListStr("ab"))?.data)
    println(findMiddleNode(toLinkedListStr("abc"))?.data)
}

执行结果为:

abcde 的中位节点是:c
null
a
b
b

时间复杂度:O(n)
空间复杂度:O(1)

相关文章

  • 求链表的中间节点

    这题考察的也是快慢指针。 我们对偶数和奇数分别进行分析: 当链表是偶数时,我们需要判断他自身是否为 null,如果...

  • 求链表的中间节点

    给定一个单向链表,怎么找到该链表的中位节点? 可以使用快慢指针,定义 2 个指针变量,慢指针移动步数为 1,快指针...

  • 求链表的中间节点

  • 常见算法总结

    链表 单链表反转链表中环的检测两个有序的链表合并删除链表倒数第 n 个结点求链表中间第n个节点

  • 求单向链表的中间结点

    求单向链表的中间结点 需求 非空的单向链表,返回其中间节点。如果有两个中间结点,返回第二个。链表大小控制在1~10...

  • 链表

    单向链表 链表反转 判断是否有环,找链表的中间节点 快慢指针 找环的入口(求两个链表的交点可以转化成这个问题) p...

  • P111-求链表的中间节点

    要求 如果节点总数为奇数,就返回中间节点;否则,返回中间两个节点的任意一个。 注意 鲁棒性:判断链表是否为空 代码...

  • 求两个链表的交点

    已知链表A的头节点指针headA,链表B的头节点指针headB,两个链表相交,求两链表交点对应的节点。[](Lee...

  • 链表Java实现

    获取链表中间结点 获取链表倒数第 k 个节点

  • 链表中间节点思路

    找链表的中间节点,可以依赖快慢指针来求解。思路是:一个慢指针,从head开始一次走 1 步;另外一个快指针,从he...

网友评论

      本文标题:求链表的中间节点

      本文链接:https://www.haomeiwen.com/subject/itwfqhtx.html