class ListNode:
def __init__(self,val):
self.next = None
self.val = val
class List:
def __init__(self,li:[]):
self.head = ListNode("null as head")
self.tail = self.head
for ele in li:
self.tail.next = ListNode(ele) #创建新节点,挂到链表的尾部
self.tail = self.tail.next #链表尾部更新为新创建的节点
def length(self):
curr = self.head
len = 0
while curr.next:
len = len + 1
curr = curr.next
return len
def print(self):
output = ""
curr = self.head
while curr.next:
output = output + " " +str(curr.next.val)
curr = curr.next
print(output)
def append(self,val):
self.tail.next = ListNode(val)
self.tail = self.tail.next
def insert(self,index,before:bool,val): #index: 从0开始 , before: true-index前插,false-index后插, val: 值
if index > self.length() - 1:
raise Exception("插入位置不能超过列表长度减一,当前插入位置{},数组长度{}".format(index,self.length()))
toinsert = ListNode(val)
targetnode = self.head
if before: #如果前插,则找到目标节点的前一个节点
for i in range(0,index):
targetnode = targetnode.next
else: #如果后插,则找到目标节点
for i in range(0,index+1):
targetnode = targetnode.next
tmpnode = targetnode.next #先关联链表后续内容,防止丢失
toinsert.next = tmpnode #新创建的节点指向后续内容
targetnode.next = toinsert #目标节点指向新节点
def __contains__(self, item):
index = -1
currnode = self.head
while currnode.next:
index = index + 1
if currnode.next.val == item:
return index
currnode = currnode.next
return index
def remove(self,all:bool,val): #all : true - 所有匹配的都删除 false - 仅删除第一个
currnode = self.head
while currnode.next:
if currnode.next.val == val:
if currnode.next.next: #如果有下下个节点,则让当前节点指向下下个节点
currnode.next = currnode.next.next
else: #如果没有下下个节点,则让当前节点指向None
currnode.next = None
if all:
continue
else:
return
else:
currnode = currnode.next
def modify(self,index,val):
if index < 0:
return False
currnode = self.head
for i in range(0,index+1):
if currnode.next:
currnode = currnode.next
currnode.val = val
li = List([1,2,3,'a','b','c'])
li.print()
li.append("vba")
li.print()
li.insert(3,before=True,val="iii")
li.print()
li.insert(0,before=False,val="jjj")
li.insert(0,before=False,val="jjj")
li.print()
ret = li.__contains__("vba")
print(str(ret))
li.remove(all=True,val="vba")
li.print()
li.modify(0,"xxx")
li.print()
[DnA] 单向链表
最新推荐文章于 2023-08-03 21:25:54 发布