首页 > 其他分享 >单链表反转

单链表反转

时间:2023-08-13 23:00:13浏览次数:39  
标签:head 单链 ListNode nil 反转 Next return curNode

单链表反转

反转单链表是一个很常见的问题

迭代法

最直观的方法就是遍历链表的同时将其反转

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 {
		return nil
	}
	var perNode, curNode *ListNode
	perNode = head
	curNode = head.Next
	head.Next = nil
	for curNode != nil {
		nextNode := curNode.Next
		curNode.Next = perNode
		perNode = curNode
		curNode = nextNode
	}
	return perNode
}

头插法

头插法就是遍历原链表的同时,将节点添加到新链表的头部

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 {
        return nil
    }
	newHead := &ListNode{Val: head.Val, Next:nil}
    curNode := head.Next
    for curNode != nil {
        newHead = &ListNode{Val: curNode.Val, Next: newHead}
        curNode = curNode.Next
    }
    return newHead
}

递归法

利用递归的思路来解决这个问题

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
    }
	newHead := ReverseList(head.Next)
    head.Next.Next = head
    head.Next = nil
    return newHead
}

总结

迭代法最直观,时间复杂度为O(n),空间复杂度为O(1)。但是在编写代码时容易出错。

头插法通过逆向思维,将链表反转,时间复杂度O(n),空间复杂度O(n)

递归法代码简洁,时间复杂度O(n),空间复杂度O(n)

标签:head,单链,ListNode,nil,反转,Next,return,curNode
From: https://www.cnblogs.com/mengzhuo/p/17627478.html

相关文章

  • 某公司笔试题 - 字符串反转(附python代码)
    #接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)importrestr1=input("请输入一个只有小写字母的字符串:")#通过正则表达式只匹配输入字符串中的小写字母str2=re.sub('[^a-z]','',str1)print(str2)iflen(str2)>0andlen(str2)......
  • 使用 Spring 实现控制反转和依赖注入
    概述在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们。什么是控制反转?控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。与传统编程相比,传统编程中我们的自定义代......
  • 沪深300连续涨跌反转策略
    上个月,在查看个人的净值时,发现有时候净值居然会连续跌5-7天。突然就想,如果在连续跌了4-5天后,指数应该会有较大的概率涨。所以决定回测一下。策略逻辑在HS300连续跌了N(4)天时分日分批买入;买入后:如果涨幅大于2%,则直接卖出;如果跌幅大于2%,则加仓;如果不能加仓,则卖出;按照50......
  • 递归反转链表局部[labuladong-刷题打卡 day8]
    写在前面前两天刷题打卡,感觉东哥的代码模板没有题解中的简洁,或者那些极限优化的代码中有很多优化技巧,但今天去感受递归的含义的时候,觉得毕竟我现在是在学习算法,理解算法含义才是学习的意义。至于优化,那是之后的事,所以刷题的时候不必过于追求简洁,就像追求简洁而降低可读性一样属......
  • 反转单向链表
    反转单向链表时间复杂度:O(N)空间复杂度:O(1)voidreverse_list(node**head_ptr){ node*prev=NULL; node*curr=*head_ptr; node*next=NULL; while(curr!=NULL){ next=curr->next; curr->next=prev; prev=curr; curr=next; } *head_......
  • 代码随想录算法训练营第七天|力扣334.反转字符串、力扣541.反转字符串II、剑指offer05
    字符串反转字符串(力扣344.)如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。毕竟面试官一定不是考察你对库函数的熟悉程度,如果使用python和java的同学更需要注意这一点,因为python、java提供的库函数十分丰富。如果库函数仅仅是解题过程中的一小部分,并且......
  • LeetCode 206 反转链表,LeetCode 92反转链表Ⅱ
    反转链表给你单链表的头节点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写法一:不使用头节点,......
  • 洛谷 P1553 数字反转(升级版)
    题目描述给定一个数,请将该数各个位上数字反转得到一个新数。整数反转是将所有数位对调。小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。百分数的分子一定是整数,百分数只改变数字......
  • 反转链表系列图解
    1.反转链表给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。图解代码实现publicListNodeReverseList(ListNodehead){ListNodecur=head;ListNodepre=null;ListNodenext=null;......
  • 依赖注入(DI)、控制反转(IOC)、反射的区别和联系?
    实现IOC控制反转的技术叫做反射。而反射通俗的说,反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让应用在运行时才动态决定生成哪一种对象。反射的应用是很广泛的,像Hibernate、Spring中都是用“反射”做为最基本的技术手段。其实可以把IoC模式看作工厂模式的升华,把IoC......