【链表】反转链表

一、题目

牛客题目链接反转链表_牛客题霸_牛客网

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

输入:{}

返回值:{}

说明:空链表则输出空

二、解题思路

遍历每个节点,将节点的指针转为指向上一个节点,在变更指针之前先将当前指针的值保存在临时变量中,然后将指向上一节点的指针后移到当前节点,指向当前节点的指针后移到下一个节点。

再梳理一下,当链表反转,需要做如下几步操作:

  1. 保存 pHead 的下一个节点,防止后续链表丢失
  2. 将 pHead 指向 newHead,完成节点反转
  3. 更新 newHead 为 pHead,将完成反转的节点加入链表
  4. 更新 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
}

解题思路二:递归实现

  1. 递归找到根节点
  2. 根节点指向上一个节点
  3. 删除上一个节点的Next
  4. 返回根节点
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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值