刷题使我快乐,满脸开心.jpg

  • 来源:力扣(LeetCode)
  • 链接:https://leetcode.cn/problems/reverse-linked-list/
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

思路

迭代思路是比较直观的,就是小心边界和操作顺序
递归思路注意最终新链表的尾部需要指向nil

代码

func reverseList(head *ListNode) *ListNode {
	// 应对传入头为空
	if head == nil {
		return head
	}
	// 应对递归到尾部开始回返
	if head.Next == nil {
		return head
	}
	newHead := reverseList(head.Next)
	head.Next.Next = head
	head.Next = nil
	return newHead
}

func reverseList(head *ListNode) *ListNode {
	var pre *ListNode
	now := head
	for now != nil {
		next := now.Next
		now.Next = pre
		pre = now
		now = next
	}
	return pre
}