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)))))
複製代碼
相關文章
相關標籤/搜索