反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/re…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
整个思路很简单,把当前元素的Next指针指向前。
所以需要记录前一个值的地址,然后把当前指针的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)))))