题目描述
反转一个单链表。
示例:
输入: 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 ptr *ListNode
for head != nil {
next := head.Next
head.Next = ptr
ptr = head
head = next
}
return ptr
}
解题思路
-
利用递归思想
-
递归找到最后一个节点,返回
-
最后一个节点返回时,当前节点为第四个节点。将最后一个节点的下一个指向第四个节点。即head.next.next = head
-
避免循环引用,将第四个节点的下一个指向为空。并返回最后一个节点
-
等待第三个节点设置第四个节点的指向。并返回最后一个节点
-
依此类推,当第一个节点设置完第二个节点的指向,即可返回最后一个节点
-
最后一个节点即为反转链表的头指针
-
不妨假设链表为1,2,3,4,5。按照递归,当执行reverseList(5)的时候返回了5这个节点,reverseList(4)中的p就是5这个节点,我们看看reverseList(4)接下来执行完之后,5->next = 4, 4->next = null。这时候返回了p这个节点,也就是链表5->4->null,接下来执行reverseList(3),代码解析为4->next = 3,3->next = null,这个时候p就变成了,5->4->3->null, reverseList(2), reverseList(1)依次类推,p就是:5->4->3->2->1->null。
代码实现
/**
* 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
}
ptr := reverseList(head.Next)
head.Next.Next = head
head.Next = nil
return ptr
}