【每日一算法】(六)反转链表 leetcode 24题

2023-11-17 11:01:53 浏览数 (1)

给定单链表的头节点 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()
}

0 人点赞