一、题目
牛客题目链接:反转链表_牛客题霸_牛客网
LeeCode 题目链接:206. 反转链表 - 力扣(LeetCode)
题目描述:
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
示例1
输入:{1,2,3}
返回值:{3,2,1}
示例2
输入:{}
返回值:{}
说明:空链表则输出空
二、解题思路
遍历每个节点,将节点的指针转为指向上一个节点,在变更指针之前先将当前指针的值保存在临时变量中,然后将指向上一节点的指针后移到当前节点,指向当前节点的指针后移到下一个节点。
再梳理一下,当链表反转,需要做如下几步操作:
- 保存 pHead 的下一个节点,防止后续链表丢失
- 将 pHead 指向 newHead,完成节点反转
- 更新 newHead 为 pHead,将完成反转的节点加入链表
- 更新 pHead,继续反转还未反转的链表
三、代码实现
golang:
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
func ReverseList( head *ListNode ) *ListNode {
// write code here
if head == nil || head.Next == nil {
return head
}
var newHead *ListNode
for head != nil {
pNext := head.Next //保留反转链表
head.Next = newHead //节点反转
newHead = head //更新已反转链表
head = pNext //更新当前节点
}
return newHead
}
解题思路二:递归实现
- 递归找到根节点
- 根节点指向上一个节点
- 删除上一个节点的Next
- 返回根节点
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
func ReverseList( head *ListNode ) *ListNode {
// write code here
if head == nil || head.Next == nil {
return head
}
root := ReverseList(head.Next) //获取根节点
head.Next.Next = head
head.Next = nil
return root
}