链表的定义
# 链表-一种存储数据的数据结构
# 特点:物理存储单元上非连续的存储结构
# 当我们想在数组的某一个元素之前插入数据的化,需要将该元素以及其后面的所有的元素往后挪一个位置,然后插入。如果说想删除一个元素,就是删除目标元素,同时将目标元素后面的所有元素都向前挪一个位置。
# 假定一个数字的长度为n
# 插入和删除操作的时间复杂度就是O(n)
# 链表的定义
class Node():
def __init__(self,value,next=None):
self.value = value
self.next = next
# 定义链表节点-----------------------
#定义出来结点了
head = Node(10000)
#head是只有一个结点的链表
head.next = Node(9999)#在head后面添加了一个值为9999的节点
head.next.next = Node(9998)#在head后面的后面添加了一个值为9998的节点
#head是一个头节点的值为10000,第二个节点的值为9999的链表
查看链表节点
#如何查看链表里面的元素.没有办法事先知道链表的长度的
def print_linklist(head):
while head:#head有数据域和指针域
print(head.value)
head = head.next
链表的插入
#链表的插入操作,并且返回头节点
#在链表的target元素之前插入value,如果target不存在,则在链表的末尾插入元素
def add_node_in_linklist(head,value,target):
#head代表链表的头节点
#value是要插入的值
#target在目标元素之前插入
#插入操作是1. 找出目标节点 2. 将目标节点的前一个节点指向新插入的节点 3. 将新节点的指针指向目标节点
pre = None
newNode = Node(value)
tempHead = head
while tempHead:
if tempHead.value == target:
if pre is None:
newNode.next = head
return newNode
pre.next = newNode
newNode.next = tempHead
return head
else:
pre = tempHead
tempHead = tempHead.next
pre.next = newNode
return head
print_linklist(head)
链表的长度
#求链表的长度
def get_linklist_length(head):
length = 0
while head is not None:#当前节点是有值的
length +=1
head = head.next
return length
print("链表的长度为",get_linklist_length(head))
删除链表
#对应第n个节点来说其父节点就是第n-1个节点
def delete_target_from_linklist(head,target):
#head 代表给定链表的头节点
#target代表给定链表中要删除的元素值
pre = None
result = head
while head is not None:#当前节点是有值的
if head.value == target:
if pre is None:
#print("head.value",head.value)
return head.next
pre.next = head.next#实现删除head的作用
return result
pre = head
head = head.next
return result
head = delete_target_from_linklist(head,10000)#表示删除了目标节点的链表的新的头节点
print_linklist(head)
# 执行结果:
# E:\工作\测试开发\3-算法课资料>python 20200329LinkTest_Myself.py
# 10000
# 9999
# 9998
# 链表的长度为 3
# 9999
# 9998