R7的算法

单向链表反转

2020-01-02  本文已影响0人  R7_Perfect

先定义单向链表结构

class ListNode (val id : Int) {
        var next: ListNode? = null
    }

假如有一个单向链表:
1->2->3->4->null
反转步骤如下

1->null
2->3->4->null
2->1->null
3->4->null
3->2->1->null
4->null
4->3->2->1->null

实现代码:

fun reverseList(_head: ListNode?): ListNode? {
        var head = _head
        var next: ListNode? = null
        var pre: ListNode? = null

        while (head != null) {
            next = head.next
            head.next = pre
            pre = head
            head = next
        }
        return pre
    }

先将下一个节点保存起来。
next = head.next

处理当前节点的next指针,指向之前保存的pre
head.next = pre

保存当前节点为pre,给下一个使用
pre = head

准备处理当前节点的下一个节点
head = next

完整测试代码:

object Solution {
    fun reverseList(_head: ListNode?): ListNode? {
        var head = _head
        var next: ListNode? = null
        var pre: ListNode? = null

        while (head != null) {
            next = head.next
            head.next = pre
            pre = head
            head = next
        }
        return pre
    }

    @JvmStatic
    fun main(args: Array<String>) {
        val n1 = ListNode(1)
        val n2 = ListNode(2)
        val n3 = ListNode(3)
        val n4 = ListNode(4)
        n1.next = n2
        n2.next = n3
        n3.next = n4
        reverseList(n1)
    }
}

data class ListNode (var `val`: Int) {
    var next: ListNode? = null
}
上一篇 下一篇

猜你喜欢

热点阅读