is_empty() 链表是否为空
length() 链表长度
travel() 遍历整个链表
add(item) 链表头部添加元素
append(item) 链表尾部添加元素
insert(pos, item) 指定位置添加元素
remove(item) 删除节点
search(item) 查找节点是否存在
class Node:
def __init__(self, item):
self.item = item
self.next = None
class SingleList:
def __init__(self):
self.head=None
def is_empty(self):
return self.head==None
def length(self):
if self.is_empty():
return 0
cur=self.head
count=0
while cur!=None:
count+=1
cur=cur.next
return count
def travel(self):
if self.is_empty():
return
cur=self.head
while cur!=None:
print(cur.item,end='\t')
cur=cur.next
def add(self,item):
node = Node(item)
if self.is_empty():
self.head=node
return
else:
node.next=self.head
self.head=node
def append(self,item):
node = Node(item)
if self.is_empty():
self.head=node
return
else:
cur=self.head
while cur.next!=None:
cur=cur.next
cur.next=node
def insert(self,pos,item):
if pos<=0:
self.add(item)
elif pos>=(self.length()-1):
self.append(item)
else:
count=0
node = Node(item)
cur=self.head
while count<(pos-1):
count+=1
cur=cur.next
node.next=cur.next
cur.next=node
def remove(self,item):
if self.is_empty():
return
cur=self.head
pre=None
while cur!=None:
if cur.item==item:
if pre==None:
self.head=cur.next
# break
else:
pre.next=cur.next
break
pre=cur
cur=cur.next
def search(self,item):
if self.is_empty():
return
cur=self.head
while cur!=None:
if cur.item==item:
return True
cur=cur.next
return False
single_list = SingleList()
for i in [3,2,1,4,5]:
single_list.add(i)
single_list.travel()
print("")
for i in [13,12,11,14,15]:
single_list.append(i)
single_list.travel()
print("")
single_list.insert(3,100)
single_list.travel()
print("")
single_list.remove(5)
single_list.travel()
print("")
print(single_list.search(100))
单链表有创建节点,初始化(将head置为空),求长度,遍历。
求长度和遍历本质上是差不多的。
再就是插入元素,分为头插,尾插,指定位置插入。
删除,按照元素进行删除
搜索
单链表中创建节点比较简单,然后是创建为None的链表也比较容易。接下来就是求长度,进行遍历了。在求长度和遍历的过程中指针一直都是后移,所以应该在循环中判断当前指针是否为末尾的状态,遍历除了循环条件的判断其他难度不高。
然后就是插入元素操作,插入元素分为多种情况,头插法比较容易,只是比较head指针和当前插入节点的。
尾插法需要遍历到文件的末尾。
在任意位置插入,如果是最开始就是头插法,最后的话就是尾插法,中间位置的情况需要比较。中间位置需要不断进行指针后移。
删除元素,用双指针。
搜索元素其实本质上和求长度和遍历都是一样的。
单链表的节点创建就是封装一个结构,这个结构中包含有数据和指向下一个节点的指针。
单链表的初始化就是创建一个一个空的链表,这个链表中不包含有元素。
单链表的判断空,其实就是判断是否包含节点。
单聊表的求长度,其实就是从头指针的位置从前向后就行遍历,怎么遍历是依靠节点的next域,从而找到下一个节点的。需要在一个循环中进行,每走一遍循环体,循环计数器不断加1操作。
单聊表的遍历和求长度是一样的,都是通过移动头指针,不断向后进行遍历,通过next域找到下一个节点,在循环体中访问当前节点,输出打印即可。
单链表的在头结点添加,通过移动head指针,即当前节点和head的指向是一样的,然后head指针指向新加入的节点。必须操作的是self.head指针。
单链表的尾部添加,从前向后遍历,一直循环到当前节点的next域为空。循环结束后,当前指针节点的next域指向新加入的节点。
单链表的任意位置添加,根据位置的不同,分为头和尾。头和尾如上所示,中间的任意位置,通过计数器从前向后访问,找到需要添加元素的位置。修改新加入节点的next为当前指针节点的next域,当前指针节点的next域指向新加入节点。
单链表的删除,利用经典的双指针法,技巧性是利用双指针,一个在前cur,一个在紧跟的后一个节点pre。具体情况分为被删除是否为头结点,如果是头结点,那么判断的条件是pre必定为空,将head指针的next指向当前节点的next域。
通过循环,在循环体中判断,如果不是头结点,那么修改pre的next域为当前节点cur的next域。
单链表的搜索,本质上和遍历是一样的。从 前到后进行遍历访问,如果能找到,返回为true。一直访问到结尾也没有找到,返回为false。