LeetCode 206. Reverse Linked List(反转链表)

342 阅读1分钟

leetcode.com/problems/re…

Discuss:www.cnblogs.com/grandyang/p…

Given the head of a singly linked list, reverse the list, and return the reversed list.

Example 1:

image.png

Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]

Example 2:

image.png

Input: head = [1,2]
Output: [2,1]

Example 3:

Input: head = []
Output: []

Constraints:

The number of nodes in the list is the range [0, 5000].

-5000 <= Node.val <= 5000

Follow up: A linked list can be reversed either iteratively or recursively. Could you implement both?

解法一:

迭代求解。

/**
 * Example:
 * var li = ListNode(5)
 * var v = li.`val`
 * Definition for singly-linked list.
 * class ListNode(var `val`: Int) {
 *     var next: ListNode? = null
 * }
 */
class Solution {
    fun reverseList(head: ListNode?): ListNode? {
        if (head?.next == null) {
            return head
        }

        var cur: ListNode? = head
        var pre: ListNode? = null

        while (cur != null) {
            val tempNode = cur.next
            cur.next = pre
            pre = cur
            cur = tempNode
        }
        return pre
    }
}

解法二:

递归求解。

/**
 * Example:
 * var li = ListNode(5)
 * var v = li.`val`
 * Definition for singly-linked list.
 * class ListNode(var `val`: Int) {
 *     var next: ListNode? = null
 * }
 */
class Solution {
    fun reverseList(head: ListNode?): ListNode? {
        if (head?.next == null) {
            return head
        }

        val listNode = reverseList(head.next)

        head.next?.next = head

        head.next = null

        return listNode
    }
}