给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。
比如:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
代码解答:注释讲的比较全面了
func reverseList(head *ListNode) *ListNode {
//首先,空节点,以及单节点直接返回
if head == nil || head.Next == nil {
return head
}
//思想:链表是一个逻辑结构,反转链表,其实就是把next的由下一个元素的地址,换成上一个元素的地址即可。
//而之前的链表是正序的,我们无法知道前一个元素,那么怎么办呢? 新建一个长度+1的链表,这样我们就有了两个长度差1的链表,通过差的这一个长度,就可以知道上一个元素
longList := &ListNode{Next: head}
ptr := head.Next // 这里我们从head链表的第二个元素开始,作为指针(因为要把所有next指向上一个元素,选第一个就没有上一个元素了)
head.Next = nil // 这里将head.Next置为nil,否则,翻转时,当第二个元素的next指向head后,head仍指向第二个元素,就死循环了。
for ptr != nil {
//这里是链表的步进
cur := ptr
ptr = ptr.Next
//这里是关键,我们在这里要把next都指向上一个元素,但是怎么做呢?
cur.Next = longList.Next //第一次遍历时,此时cur是第二个元素,Next应该指向第一个元素,那么第一个元素正好是longList.Next
//我们要保证下次遍历时,也就是cur是第三个元素时,longList.Next是第二个元素,所以才有这一步
longList.Next = cur
}
return longList.Next // 实际我们返回的是最后一次遍历中cur的值
}