单链表逆序

69 阅读1分钟

为了方便编写,我这里用 kotlin 实现

定义结点结构

data class Node(
    /**
     * 携带内容
     */
    val label:String = "",
    /**
     * 指向的下一个结点
     */
    var next:Node?=null
)

创建单链表方法

private fun buildNodeLink(nodeHead: Node?) {
    println("====================buildNodeLink======================")
    var p:Node? = nodeHead
    for (idx in 0 until 10) {
        val newNode = Node(label = "Item ${idx + 1}")
        p?.next = newNode
        p = newNode
    }
}

遍历打印单链表

用于检验结果

private fun printNodeLink(nodeHead:Node?) {
    println("====================printNodeLink======================")
    var p:Node? = nodeHead
    while (true) {
        if (p == null) break
        println(p.label)
        p = p.next
    }
}

单链表逆序算法

private fun reverseNodeLink(nodeHead: Node?):Node? {
    println("====================reverseNodeLink======================")
    val p:Node? = nodeHead
    var pre:Node? = p        // 前结点
    var mid:Node? = p?.next  // 中间结点
    var next:Node? = p?.next?.next // 后结点

    pre?.next = null // 第一个结点 next 指向 null
    while (true) {
        mid?.next = pre  // 中间结点 next 指向 前结点
        pre = mid        // 前结点 指向 中间结点
        mid = next       // 中间结点 指向 后结点
        next = next?.next //  后结点 往后走
        if (mid == null) {
            break
        }
    }
    return pre
}

开始测试

@Test
fun singleLinkReverse() {
    var nodeHead:Node? = Node(label = "Head")
    // 构建单链表
    buildNodeLink(nodeHead)
    // 遍历打印单链表
    printNodeLink(nodeHead)
    // 逆转单链表
    nodeHead = reverseNodeLink(nodeHead)
    // 遍历打印单链表
    printNodeLink(nodeHead)
}

打印结果

====================buildNodeLink======================
====================printNodeLink======================
Head
Item 1
Item 2
Item 3
Item 4
Item 5
Item 6
Item 7
Item 8
Item 9
Item 10
====================reverseNodeLink======================
====================printNodeLink======================
Item 10
Item 9
Item 8
Item 7
Item 6
Item 5
Item 4
Item 3
Item 2
Item 1
Head