# 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月

#### 剑指offer：二叉搜索树与双向链表（Python）

2018-03-22 17:34:01

#### python实现双端链表(原创请勿转载)

2018-06-06 18:47:15

#### python描述双向链表

2017-12-04 21:33:00

#### 双链表及python代码实现

2018-06-04 16:05:49

#### python双向链表的疑问(Question)

2016-11-23 00:07:19

#### Python实现双向链表的基本操作

2017-10-05 18:26:05

#### [从头学数学] 第262节 Python实现数据结构：双向链表

2016-09-17 12:06:31

#### python实现双向链表

2016-10-26 22:43:55

#### Python 实现双链表，栈，队列

2017-02-24 17:07:35

#### 删除双向链表的一个指定节点

2015-02-27 11:29:44