原文連接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作了記錄之後指向前一個值。
之因此須要先作記錄是由於指向了前一個值以後就找不到本來指向的下一個值了呀。
使用了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) } 複製代碼
;; 定義了一個鏈表結構體 (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))))) 複製代碼