python双向链表反转_python实现双向链表基本结构及其基本方法

双向链表是在单向链表的基础上更为复杂的数据结构,其中一个节点除了含有自身信息外,还应该含有连接一下个节点和上一个节点的信息。

双向链表适用于需要双向查找节点值的场景中,在数据量难以估计并且数据增删操作频繁的场景中,双向链表有一定优势;链表在内存中呈现的状态是离散的地址块,不需要像列表一样预先分配内存空间,在内存的充分利用上更胜一筹,不过增加了一些额外开销。

双向链表结构如图:

定义基本的节点类和链表类,并添加相应的操作方法,源码如下:

class Node():

def __init__(self,item):

self.item = item

self.next = None #存储下一个节点的信息

self.prev = None #存储上一个节点的信息

class DLinkList():

def __init__(self):

self.head = None

def is_empty(self): #判断是否为空

return None == self.head

def length(self): #长度

if self.is_empty():

return 0

else:

cur =self.head

n = 1

while cur.next != None:

cur = cur.next

n += 1

return n

def ergodic(self):

if self.is_empty():

print(None)

else:

cur = self.head

while cur.next != None:

print(cur.item)

cur = cur.next

print(cur.item)

def add(self,item): #头部添加节点

node = Node(item)

if self.is_empty():

self.head = node

else:

node.next = self.head

self.head.prev = node

self.head = node

def append(self,item):

#尾部添加节点

if self.is_empty():

self.add(item)

else:

cur = self.head

while cur.next:

cur = cur.next

node = Node(item)

cur.next = node

node.prev = cur

def insert(self,index,item):

#任意位置插入节点

node = Node(item)

if index == 0 :

self.add(item)

elif index >self.length() - 1:

self.append(item)

else:

cur = self.head

n = 1

while cur.next != None:

if n == index:

break

cur = cur.next

n += 1

cur.next.prev = node

node.next = cur.next

node.prev = cur

cur.next = node

def delet(self,index):

if self.is_empty():

raise ValueError("ERROR NULL")

elif index == 0 and self.length() == 1:

self.head = None

elif index == 0 and self.length() > 1:

self.head = self.head.next

self.head.next.prev = None

elif index == self.length() - 1:

cur = self.head

while cur.next != None:

cur = cur.next

cur.prev.next = None

else:

cur = self.head

num = 1

while cur != None:

if num == index:

break

cur = cur.next

num += 1

cur.next.next.prev = cur

cur.next = cur.next.next

注意在删除节点的时候要考虑几种特殊情况:删除节点为第一个节点,并且链表只有一个节点;删除节点为第一个节点并且链表长度大于1;删除节点是中间节点;删除节点是最后一个节点;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值