给定单链表的头节点 head
,请反转链表,并返回反转后的链表的头节点。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
代码语言:javascript复制思考1:
迭代法,使用临时值交换求解,直接使用迭代完成
type LinkNode struct {
val int
Next *LinkNode
}
func reverseList1(head *LinkNode) (temp *LinkNode) {
for head != nil {
// 声明临时节点等于head的下一个节点
next := head.Next
// 当第一次循环时
// temp 为nil,所以此时head的下一个节点指向temp,即指向为空
// 也就是head.Next = nil
// 此时temp=head,也就是temp.Next=nil
// 再将临时节点赋值给head
// 以此类推
head.Next, temp, head = temp, head, next
}
return
}
思考2:
递归法, 递归比较抽象,理解起来较为困难
func reverseList2(head *LinkNode) (temp *LinkNode) {
if head == nil || head.Next == nil {
return head
}
temp = reverseList2(head.Next)
head.Next.Next = head
head.Next = nil
return
}
思考3:
使用栈,昨天刚刚写过的知识,如有不懂可以去查阅一下
遍历列表并入栈
遍历栈
func reverseList3(head *LinkNode) {
stack := NewStack()
for head != nil {
stack.Push(head.val)
head = head.Next
}
stack.Print()
}