一、链表
1.理解链表的需求和重要性
2.在给定的链表中插入和删除项
3.使用链表实现堆栈和队列
4.理解与链表相关的问题
链表是一种以节点为基本单元的数据结构。每个节点有两部分即:数据和链接。数据部分包含值,而链接部分包含下一个节点的地址。
如图:
链表用于许多问题,比如动态堆栈和队列的实现,以及树和图等非线性数据结构的实现。
在某些情况下,在树的实现中不使用链表。在实现非线性数据结构时,必须仔细考虑链表的需要。例如,如果我们有一个平衡的二叉树或堆,那么使用数组比使用链表要好得多。链表的第一个节点将用HEAD表示。还可以注意到,最后一个节点的链接为NULL,表示在最后一个节点之后没有节点。
链表操作:
插入在开始、在中间插入、插入在结束、删除在开始、删除在中间、删除在最后
双链表操作:
插入在开始、在中间插入、插入在结束、删除在开始、删除在中间、删除在最后
循环链表:
在循环链表中,最后一个节点连接到第一个节点。也就是说,最后一个节点的“NEXT”包含第一个节点的地址。
链表实现堆栈:
class Node:
def __init__(self):
self.data = None
self.link = None
def setVal(self, val):
self.data = val
def getVal(self):
return self.data
def setNext(self, next):
self.link = next
def getNext(self):
return self.link
def hasNext(self):
if self.link != None:
return True
else:
return False
class Stack:
def __init__(self):
self.head =None
self.length = 0
def Length(self):
current = self.head
count = 0
while current !=None:
count = count + 1
current = current.getNext()
return count
def push(self, val):
tempNode = Node()
tempNode.setVal(val)
current = self.head
if current!=None:
while current.getNext() != None:
current = current.getNext()
current.setNext(tempNode)
self.length+=1
else:
self.head = tempNode
def pop(self):
current = self.head
if current!=None:
while (current.link).link != None:
current = current.link
data =current.data
current.link = None
else:
print('Underflow')
data = -1
return data
def traverse(self):
current = self.head
while current !=None:
print(current.data, end ="")
current = current.getNext()
S =Stack()
print('\nStack')
S.traverse()
S.push(2)
S.traverse()
print('\nStack')
S.push(5)
S.traverse()
print('\nStack')
S.push(3)
S.traverse()
结果:
Stack
2
Stack
25
Stack
253
链表实现队列:
同理。