时间:2021-05-22
如何把一个单链表进行反转?
方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。
方法2:使用3个指针遍历单链表,逐个链接点进行反转。
方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
方法4: 递归(相信我们都熟悉的一点是,对于树的大部分问题,基本可以考虑用递归来解决。但是我们不太熟悉的一点是,对于单链表的一些问题,也可以使用递归。可以认为单链表是一颗永远只有左(右)子树的树,因此可以考虑用递归来解决。或者说,因为单链表本身的结构也有自相似的特点,所以可以考虑用递归来解决)
开辟辅助数组,新建表头反转,就地反转,递归反转
# -*- coding: utf-8 -*-'''链表逆序'''class ListNode: def __init__(self,x): self.val=x self.next=None '''第一种方法:对于一个长度为n的单链表head,用一个大小为n的数组arr储存从单链表从头到尾遍历的所有元素,在从arr尾到头读取元素简历一个新的单链表时间消耗O(n),空间消耗O(n)''' def reverse_linkedlist1(head): if head == None or head.next == None: #边界条件 return head arr = [] # 空间消耗为n,n为单链表的长度 while head: arr.append(head.val) head = head.next newhead = ListNode(0) tmp = newhead for i in arr[::-1]: tmp.next = ListNode(i) tmp = tmp.next return newhead.next '''开始以单链表的第一个元素为循环变量cur,并设置2个辅助变量tmp,保存数据;newhead,新的翻转链表的表头。时间消耗O(n),空间消耗O(1)''' def reverse_linkedlist2(head): if head == None or head.next == None: #边界条件 return head cur = head #循环变量 tmp = None #保存数据的临时变量 newhead = None #新的翻转单链表的表头 while cur: tmp = cur.next cur.next = newhead newhead = cur # 更新 新链表的表头 cur = tmp return newhead '''开始以单链表的第二个元素为循环变量,用2个变量循环向后操作,并设置1个辅助变量tmp,保存数据;时间消耗O(n),空间消耗O(1)''' def reverse_linkedlist3(head): if head == None or head.next == None: #边界条件 return head p1 = head #循环变量1 p2 = head.next #循环变量2 tmp = None #保存数据的临时变量 while p2: tmp = p2.next p2.next = p1 p1 = p2 p2 = tmp head.next = None return p1 '''递归操作,先将从第一个点开始翻转转换从下一个节点开始翻转直至只剩一个节点时间消耗O(n),空间消耗O(1)''' def reverse_linkedlist4(head): if head is None or head.next is None: return head else: newhead=reverse_linkedlist4(head.next) head.next.next=head head.next=None return newhead def create_ll(arr): pre = ListNode(0) tmp = pre for i in arr: tmp.next = ListNode(i) tmp = tmp.next return pre.next def print_ll(head): tmp = head while tmp: print tmp.val tmp=tmp.next a = create_ll(range(5))print_ll(a) # 0 1 2 3 4a = reverse_linkedlist1(a)print_ll(a) # 4 3 2 1 0a = reverse_linkedlist2(a)print_ll(a) # 0 1 2 3 4a = reverse_linkedlist3(a)print_ll(a) # 4 3 2 1 0a = reverse_linkedlist4(a)print_ll(a) # 0 1 2 3 4到此这篇关于用python介绍4种常用的单链表翻转的方法小结的文章就介绍到这了,更多相关python 单链表翻转内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
翻转一个链表样例:给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null一种比较简单的方法是用“摘除法”。就是先新建一个空节点,然
本文实例讲述了Python实现栈的方法。分享给大家供大家参考,具体如下:前言使用Python实现栈。两种实现方式:基于数组-数组同时基于链表实现基于单链表-单链
C语言实现单链表实现方法链表和我们之前实现过的顺序表一样,都是简单的数据结构,链表分为单向链表、双向链表、循环链表。而单向链表又分为两种实现方法,一种为带头节点
链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的。本文主要有单链表的创建、插入、删除节点等。1、概念单链表是一种链式存取的数据结构,用一
C语言的单链表是常用的数据结构之一,本文总结了单链表的常见操作,实例如下:#include#include//定义单链表结构体typedefintElemTyp