反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
|
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
思路:
在遍历列表时,将当前节点的 head.Next
指针改为指向prev
1->2->3->4->5->NULL NULL<-1<-2<-2<-4<-5
|
代码:
type ListNode struct { Val int Next *ListNode }
func reverseList(head *ListNode) *ListNode { var temp *ListNode var prev *ListNode = nil for ; head != nil; { temp = head.Next head.Next = prev prev = head head = temp } return prev }
|
递归解法很难用语言描述,我大概模拟一下递归过程,太巧妙了
func reverseList2(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } last := reverseList2(head.Next) println(head.Val, last.Val) head.Next.Next = head head.Next = nil return last }
|
reverseList(1->2->3->4->5->nil) revreverseList(2->3->4->5->nil)
reverseList(3->4->5->nil) reverseList(4->5->nil) reverseList(5->nil) head = 5->nil return last = head head = 4->5->nil head.Next.Next = head // 5.Next -> 4 head.Next = nil // 4.Next -> nil return last = 5->4->nil head = 3->4<-5 | nil head.Next.Next = head // 4.Next -> 3 head.Next = nil // 3.Next -> nil return last = 5->4-3->nil head = 2->3<-4<-5 | nil head.Next.Next = head // 3.Next -> 2 head.Next = nil // 2.Next -> nil return last = 5->4-3->2->nil
head = 1->2<-3<-4<-5 | nil head.Next.Next = head // 2.Next -> 1 head.Next = nil // 1.Next -> nil return last = 5->4-3->2->1->nil
|