题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
方法一:迭代
解题思路
- 利用链表的头插法
- 挨着遍历原链表,头插到新链表
代码实现
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
var res *ListNode
for head != nil {
next := head.Next
head.Next = res
res = head
head = next
}
return res
}
方法二:递归
解题思路
- 使用递归函数,一直递归到链表的最后一个结点,该结点就是反转后的头结点,记作 res .
- 此后,每次函数在返回的过程中,让当前结点的下一个结点的 next 指针指向当前节点。
- 同时让当前结点的 next 指针指向 nil ,从而实现从链表尾部开始的局部反转
- 当递归函数全部出栈后,链表反转完成。
代码实现
/**
* 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
}
res := reverseList(head.Next)
head.Next.Next = head
head.Next = nil
return res
}