LEETCODE - 0206 - 反转链表

原文连接node

反转一个单链表。markdown

示例:网络

输入: 1->2->3->4->5->NULL函数

输出: 5->4->3->2->1->NULLoop

进阶: 你能够迭代或递归地反转链表。你可否用两种方法解决这道题?post

来源:力扣(LeetCode)ui

连接:leetcode-cn.com/problems/re…spa

著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。指针

解题思路

整个思路很简单,把当前元素的Next指针指向前。code

因此须要记录前一个值的地址,而后把当前指针的Next作了记录之后指向前一个值。

之因此须要先作记录是由于指向了前一个值以后就找不到本来指向的下一个值了呀。

完整代码

Golang

使用了Go的多元赋值的特性,因此主要逻辑代码就一行...

// ReverseListIteration 迭代解法
func ReverseListIteration(head *leetcode.ListNode) *leetcode.ListNode {
    var prev *leetcode.ListNode

    for head != nil {
        // nextHead := head.Next
        // head.Next = prev
        // prev = head
        // head = nextHead

        head.Next, prev, head = prev, head, head.Next
    }

    return prev
}

// ReversetListRecursion 递归解法
func ReversetListRecursion(prev, head *leetcode.ListNode) *leetcode.ListNode {
    if head == nil {
        return prev
    }

    head.Next, prev, head = prev, head, head.Next
    return ReversetListRecursion(prev, head)
}
复制代码

Common Lisp

;; 定义了一个链表结构体
(defstruct list-node val next)

;; 定义了一个构建链表的函数
(defun build-list-node (lst)
  (if (null lst)
      nil
      (make-list-node
       :val (car lst)
       :next (build-list-node (cdr lst)))))

(defun reverse-list (head) (reverse-list-helper (list nil head)))
(defun reverse-list-helper (lst)
  (if (null (nth 1 lst))
      (nth 0 lst)
      (let ((next-head (list-node-next (nth 1 lst))))
        (setf (list-node-next (nth 1 lst)) (car lst))
        (reverse-list-helper (list (nth 1 lst) next-head)))))
(format t "~A~%" (reverse-list (build-list-node (list 1 2 3 4 5))))
;; #S(LIST-NODE
;; :VAL 5
;; :NEXT #S(LIST-NODE
;; :VAL 4
;; :NEXT #S(LIST-NODE
;; :VAL 3
;; :NEXT #S(LIST-NODE
;; :VAL 2
;; :NEXT #S(LIST-NODE :VAL 1 :NEXT NIL)))))
复制代码
相关文章
相关标签/搜索