原文连接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))))) 复制代码