您的位置:首页 > 编程语言 > Python开发

python算法:LinkedList(双向线性链表)的实现

2017-07-05 09:23 393 查看
LinkedList是一个双向线性链表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。

首先,我们来实现一个Node,看代码:

class Node(object):
def __init__(self,value,prev_Node=None,next_Node=None):
self.value=value
self.prev_node=prev_Node
self.next_node=next_Node

def get_prev_node(self):
return self._prev_node

def set_prev_node(self,prev_Node):
self._prev_node=prev_Node

def del_prev_node(self):
del self._prev_node

prev_node=property(get_prev_node,set_prev_node,del_prev_node)

def get_next_node(self):
return self._next_node

def set_next_node(self,next_Node):
self._next_node=next_Node

def del_next_node(self):
del self._next_Node

next_Node=property(get_next_node,set_next_node,del_next_node)

def get_value(self):
return self._value

def set_value(self,value):
self._value=value

def del_value(self):
del self._value

value=property(get_value,set_value,del_value)


然后,生成LinkedList:

class LinkedList(object):
# comparator is a function used by LinkedList to compare nodes
# it's expected to take two parameters:
# it returns 0 if both parameters are equal, 1 if the left parameter is greater, and -1 if the lft parameter is lesser
def __init__(self, comparator):
self.head = None
self.comparator = comparator

# Adds a value to the LinkedList while maintaining a sorted state
def insert(self, value):
node = Node(value)

# If the linked list is empty, make this the head node
if self.head is None:
self.head = node
# Otherwise, insert the node into the sorted linked list
else:
curr_node = self.head
b_node_not_added = True
while b_node_not_added:
result = self.comparator(node.value, curr_node.value)

# Store the next and previous node for readability
prev = curr_node.prev_node
next = curr_node.next_node

# If the current node is greater, then insert this node into its spot
if result < 0:
# If the curr_node was the head, replace it with this node
if self.head == curr_node:
self.head = node
# Otherwise, it has a previous node so hook it up to this node
else:
node.prev_node = prev
prev.next_node = node

# Hook the current node up to this node
node.next_node = curr_node
curr_node.prev_node = node

b_node_not_added = False
# Otherwise, continue traversing
else:
# If we haven't reached the end of the list, keep traversing
if next is not None:
curr_node = next
# Otherwise, append this node
else:
curr_node.next_node = node
node.prev_node = curr_node

b_node_not_added = False

def remove(self, value):
curr_node = self.head

while curr_node is not None:
# Store the current node's neighbors for readability
prev = curr_node.prev_node
next = curr_node.next_node

# Check if this is the node we're looking for
result = self.comparator(value, curr_node.value)

# If it's equal, then remove the current node
b_node_is_equal = result == 0
if b_node_is_equal:
# If the removed node is the head node, re-assign the head node
if self.head == curr_node:
self.head = next
# Otherwise, remove the node normally
else:
if prev is not None:
prev.next_node = next
if next is not None:
next.prev_node = prev

curr_node = None
# Otherwise, continue traversing the list
else:
curr_node = next

# Print out the contents of the linked list
def print(self):
curr_node = self.head
while curr_node is not None:
print(curr_node.value)
curr_node = curr_node.next_node
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐