数据结构基础-链表 3
Posted IT界的测试混子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构基础-链表 3相关的知识,希望对你有一定的参考价值。
《漫画算法 python篇》程序员小灰
链表(linked list)
链表(linked list)是一种在物理上非连续的、非顺序的数据结构,由若干节点(node)组成。
存储方式:随机存储。
数组(顺序存储):
链表(随机存储):
灰色格子:空闲
橙色格子:被占用
红色格子:代表在内存中的位置
单向链表:每一个节点包含两部分,一部分是存放数据的变量data,另一部分是指向下个节点的指针next。
双向链表:较单向链表复杂一点,它的每个节点除了有data和next指针外,还拥有指向前置节点的prev指针。
链表的操作:
查找节点
链表查找元素只能从头开始查找。
例如,定位节点3。
- 第一步,将查找的指针定位到头节点
- 第二步,根据头部节点的next指针,定位到第二个节点。
- 第三步,根据第二个节点的next指针,定位到第三个节点。查找完毕。
更新节点
先查找节点,再替换数据
链表插入节点
尾部插入
把最后一个节点的next指针,指向新插入的节点。
头部插入
- 第一步,把新节点的next指针指向原头部节点
- 第二步,把新节点变为链表的头部节点。
中间插入
- 第一步,新节点的next指针指向插入位置的节点。
- 第二步,插入位置的前置节点的next指针,指向新节点。
链表删除节点
尾部删除
把倒数第二个节点的next指针指向NULL
头部删除
把链表的头部节点,设置为原先节点的next指针指向的节点
中间删除
把要删除的节点的前置位置的next指针,指向要删除的元素的下一个节点。
链表的操作算法:
class Node:
def __init__(self,data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.size = 0
self.head = None
self.last = None
def get(self,index):
'''查询节点'''
if index < 0 or index > self.size:
raise Exception("超出链表节点范围")
p = self.head
for i in range(index):
p = p.next
return p
def insert(self,data,index):
'''插入节点'''
if index < 0 or index > self.size:
raise Exception("超出链表节点范围")
node = Node(data)
if self.size==0:
# 空链表
self.head = node
self.last = node
elif index == 0:
# 插入头部
node.next = self.head
self.head = node
elif index == self.size:
#插入尾部
self.last.next = node
self.last = None
else:
#插入中间
prev_node = self.get(index-1)
node.next = prev_node.next
prev_node.next = node
self.size += 1
def remove(self,index):
'''删除节点'''
if index < 0 or index > self.size:
raise Exception("超出链表节点范围")
if index == 0:
#删除头部
removed_node = self.head
self.head = self.head.next
elif index == self.size:
#删除尾部
prev_node = self.get(index-1)
removed_node = prev_node.next
prev_node.next = None
self.last = prev_node
else:
#删除中间
prev_node = self.get(index - 1)
removed_node = prev_node.next
prev_node.next = prev_node.next.next
self.size -= 1
return removed_node
def output(self):
p = self.head
while p is not None:
print(p.data)
p = p.next
if __name__ == '__main__':
LinkedList = LinkedList()
print("############插入链表############")
LinkedList.insert(1,0)
LinkedList.insert(2,0)
LinkedList.insert(3,1)
LinkedList.insert(4,2)
print("LinkeList:")
LinkedList.output()
print("############查询链表############")
print("get LinkeList node 1 is:%s"%LinkedList.get(1).data)
print("############删除链表############")
print("remove node -> %s"%LinkedList.remove(3).data)
print("now LinkeList:")
LinkedList.output()
运行结果:
############插入链表############
LinkeList:
2
3
4
1
############查询链表############
get LinkeList node 1 is:3
############删除链表############
remove node -> 1
now LinkeList:
2
3
4
以上是关于数据结构基础-链表 3的主要内容,如果未能解决你的问题,请参考以下文章