线性表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。除了包含每个数据元素外,还存储了后继的存储位置。这两部分信息组成数据元素的存储映像,称为结点(node)。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称作指针或链。n个结点(() 的存储映像)链结成一个链表,即为线性表
的链式存储结构。又由于此链表的每个结点中只包含一个指针域,故又称线性链表或单链表。
1.单链表
单链表的存取必须从头指针开始进行,头指针指示链表中第一个结点(即第一个数据元素的存储映像,也称首元结点) 的存储位置。同时,由于最后一个数据元素没有直接后继,则单链表中最后一个结点的指针为空 (NULL)。
python代码实现:
class ListNode(object):
#初始化
def __init__(self, val=0, next=None):
self.val = val
self.next = next
#链表的基本操作
class LinkedList(object):
def __init__(self):
self.head = None
#判断链表是否为空
def is_empty(self):
return self.head == None
#链表长度
def length(self):
#cur初始时指向头节点
cur = self.head
count = 0
# 尾节点指向None,当未到达尾部时
while cur != None:
count += 1
# 将cur后移一个节点
cur = cur.next
return count
#遍历链表
def travel(self):
cur = self.head
while cur != None:
print(cur.val)
cur = cur.next
#头部添加元素
def addhead(self, val):
#先创建一个保存val值的节点
node = ListNode(val)
#将新节点的链接域next指向头节点(原链表头部),即head指向的位置
node.next = self.head
#将链表的头head指向新节点(构成的新链表头部)
self.head = node
#尾部添加元素
#需要先遍历到最尾端,然后使next指向新的节点
def addend(self, val):
#先创建一个保存val值的节点
node = ListNode(val)
if self.is_empty():
self.head = node
else:
cur = self.head
while cur.next != None:
cur = cur.next
cur.next = node
#指定位置插入元素
def insertone(self, pos, val):
#若头部插入,
if pos <=0:
self.addhead(val)
#若尾部插入,若pos=3,插在第三个节点后面
elif pos > (self.length()-1):
self.addend(val)
#其他位置
else:
node = ListNode(val)
cur = self.head
while (pos-1)>0:
cur=cur.next
pos -= 1
node.next = cur.next
cur.next = node
#根据值删除节点
def removeval(self, val):
cur = self.head
pre = None
while cur:
if cur.val == val:
#删除第一个节点时
if not pos:
self.head = cur.next
else:
pre.next = cur.next
break
else:
pre = cur
cur = cur.next
#删除倒数第pos个位置的节点
def removepos(self, pos, head):
node = ListNode(0, head)
first = node
second = node
while pos>=0:
first = first.next
pos -= 1
while first:
first = first.next
second = second.next
second.next = second.next.next
return node.next #返回虚拟头结点的 next,即处理后的链表的头结点。
#检测节点是否存在
def search(self,val):
cur = self.head
while cur != None:
if cur.val == val:
return True
cur = cur.next
return False