题解 | #反转链表#
反转链表
https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
package main import "fmt" type ListNode struct { Val int // 当前值 Next *ListNode // 后面待反转区 } // ReverseList // 整体思路: 如果将Next作为当前节点的子节点,则整个过程可以理解为,通过循环,不断将Next变为当前节点,并将父节点作为next,反向剥皮的过程 func ReverseList(head *ListNode) *ListNode { // 1. {} 与 {1} 时 ,不需要反转 if head == nil || head.Next == nil { return head } // 2. var newHead *ListNode // for head != nil { next := head.Next // 将待反转区暂存 head.Next = newHead // 将当前指针与后反转区 反转 newHead = head // 将反转后的链表赋值给新的链表 head = next // 将待反转区替换head, 进入下次循环 } fmt.Println(newHead) return newHead } // input {1,2,3,4} // 第一次循环前: head = {1,2,3,4} head.Next = {2,3,4} newHead = nil // 第一次循环后: head.Val=1 next={2,3,4} head.Next=nil newHead = {1} newHead.Next = nil head = {2,3,4} // 第二次循环后: head.Val=2 next={3,4} head.Next={1} newHead = {2,1} newHead.Next = {1} head = {3,4} // 第三次循环后: head.Val=3 next={4} head.Next={2,1} newHead = {3,2,1} newHead.Next = {2,1} head = {4} // 第四次循环后: head.Val=4 next=nil head.Next=nil newHead = {4,3,2,1} newHead.Next = {3,2,1} head = nil