算法:反转单链表详解-golang

给定单链表的头节点 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的值
}
posted @ 2022-09-08 10:06  _Eternity味道  Views(185)  Comments(0Edit  收藏  举报