1963人阅读 评论(2)

# Python 实现双向链表（图解）

## 双向链表基本方法实现（Python）

### 1. 初始化链表

"""节点类"""
class Node(object):
def __init__(self, data=None):
self.data = data
self.pre = None
self.next = None

"""初始化双向链表"""

def __init__(self):
"""
设置头尾，操作比较容易
头－－（next）－－》尾
尾－－（pre）－－》头
:return:
"""
tail = Node()
self.tail = tail
self.tail.pre = self.head

### 2. 获取链表长度

"""获取链表长度"""

def __len__(self):
length = 0
while node.next != self.tail:
length += 1
node = node.next
return length

### 3. 追加节点

"""追加节点"""

def append(self, data):
"""
:param data:
:return:
"""
node = Node(data)
pre = self.tail.pre
pre.next = node
node.pre = pre
self.tail.pre = node
node.next = self.tail
return node

### 4. 获取节点

 """获取节点"""
def get(self, index):
"""
获取第index个值，若index>0正向获取else 反向获取
:param index:
:return:
"""
length = len(self)
index = index if index >= 0 else length + index
if index >= length or index < 0: return None
while index:
node = node.next
index -= 1
return node

### 5. 设置节点

"""设置节点"""

def set(self, index, data):
node = self.get(index)
if node:
node.data = data
return node

### 6. 插入节点

"""插入节点"""

def insert(self, index, data):
"""
因为加了头尾节点所以获取节点node就一定存在node.next 和 node.pre
:param index:
:param data:
:return:
"""
length = len(self)
if abs(index + 1) > length:
return False
index = index if index >= 0 else index + 1 + length

next_node = self.get(index)
if next_node:
node = Node(data)
pre_node = next_node.pre
pre_node.next = node
node.pre = pre_node
node.next = next_node
next_node.pre = node
return node


### 7. 删除节点

"""删除节点"""

def delete(self, index):
node = self.get(index)
if node:
node.pre.next = node.next
node.next.pre = node.pre
return True

return False

### 8. 反转链表

1.node.next –> node.pre；node.pre –> node.next（递归）

"""反转链表"""
def __reversed__(self):
"""
1.node.next --> node.pre
node.pre --> node.next
tail.pre --> None
:return:
"""
tail = self.tail

def reverse(pre_node, node):
if node:
next_node = node.next
node.next = pre_node
pre_node.pre = node
pre_node.next = None
if node is self.tail:
node.pre = None
return reverse(node, next_node)
else:

return reverse(self.head, self.head.next)

### 9. 清空链表

"""清空链表"""
def clear(self):
self.tail.pre = self.head

2015 年 11月

1
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：32557次
• 积分：748
• 等级：
• 排名：千里之外
• 原创：44篇
• 转载：1篇
• 译文：0篇
• 评论：6条
评论排行
最新评论