目录
一、单向链表
单向链表示例图
二、单向链表的操作
1、判断链表是否为空
2,链表长度
3,遍历整个链表
4,在链表头部添加元素
5、链表尾部添加元素
6,在指定位置插入元素
7,修改指定位置的元素
8,删除元素
9、查找元素是否存在
三、完整代码
一、单向链表
单向链表示例图
结点node里有两个部分:elem(元素)和next(指向下一结点的指针),head指针指向头结点
二、单向链表的操作
1、判断链表是否为空
def is_empty(self):
"""判断链表是否为空"""
if self.__head is None:
return True
else:
return False
2,链表长度
只要当前的指针不指向None,每次遍历就加1
def length(self):
"""链表长度"""
count = 0
cur = self.__head
while cur is not None:
count += 1
cur = cur.next
return count
3,遍历整个链表
def travel(self):
"""遍历整个链表"""
cur = self.__head
while cur is not None:
print(cur.elem, end=' ')
cur = cur.next
print('')
4,在链表头部添加元素
def add(self, item):
"""链表头部添加元素"""
node = Node(item)
if self.is_empty():
self.__head = node
else:
# 新来的节点的next指向第一个节点
node.next = self.__head
# 再改变第一个节点的指针指向新节点
self.__head = node
5、链表尾部添加元素
def append(self, item):
"""链表尾部添加元素"""
# 创建新结点
node = Node(item)
# 是空链表就把头节点指向这个节点
if self.is_empty():
self.__head = node
else:
cur = self.__head
while cur.next is not None:
cur = cur.next
cur.next = node
6,在指定位置插入元素
遍历找到要插入位置的前一个结点
修改前一个结点与新插入结点的指针指向
再修改新插入结点的指针与后一个结点的指针指向
def insert(self, pos, item):
"""在指定位置插入元素"""
# 位置pos在第一个元素之前,则在头部插入
if pos <= 0:
self.add(item)
# 位置pos大于总长度,则在尾部插入
elif pos > self.length():
self.append(item)
else:
# 指定位置添加元素
node = Node(item)
count = 0
pre = self.__head
# 循环定位指针位置
while count < (pos-1):
count += 1
pre = pre.next
node.next = pre.next
pre.next = node
7,修改指定位置的元素
def modify(self, pos, item):
"""修改指定位置的元素"""
# 位置pos小于等于0时,则修改头部元素
if pos <= 0:
self.__head.elem = item
# 位置pos大于总长度,则修改尾部元素
elif pos >= self.length():
pre = self.__head
# 循环指针找到尾部元素
while pre is not None:
if pre.next is None: # pre.next为None说明已经找到尾部元素了
pre.elem = item
break
else:
pre = pre.next # 不是尾部元素就继续指针指向下一个
else:
count = 0
pre = self.__head
# 循环找出位置
while count < pos: # 1.当不满足count < pos条件时,说明指针已经指向了给定pos的位置
count += 1
pre = pre.next
pre.elem = item # 2.修改元素
8,删除元素
def remove(self, item):
"""删除节点"""
cur = self.__head
pre = None
while cur is not None:
# 找到了要删除的元素
if cur.elem == item:
# 要删除的元素就是第一个元素,就把头指针指向当前的下一个节点
if not pre:
self.__head = cur.next
else:
pre.next = cur.next
break
# 未找到要删除的元素,指向向后走,继续遍历
else:
pre = cur
cur = cur.next
9、查找元素是否存在
def search(self, item):
"""查找节点是否存在"""
cur = self.__head
while cur is not None:
# 找到了返回True,未回到指向下一个继续遍历
if cur.elem == item:
return True
cur = cur.next
return False
三、完整代码
具体说明都在注释里
class Node():
def __init__(self, elem):
# 单链表结点
self.elem = elem
self.next = None
class SingleLinkList():
def __init__(self, node=None):
self.__head = node
def is_empty(self):
"""判断链表是否为空"""
if self.__head is None:
return True
else:
return False
def length(self):
"""链表长度"""
count = 0
cur = self.__head
while cur is not None:
count += 1
cur = cur.next
return count
def travel(self):
"""遍历整个链表"""
cur = self.__head
while cur is not None:
print(cur.elem, end=' ')
cur = cur.next
print('')
def add(self, item):
"""链表头部添加元素"""
node = Node(item)
if self.is_empty():
self.__head = node
else:
# 新来的节点的next指向第一个节点
node.next = self.__head
# 再改变第一个节点的指针指向新节点
self.__head = node
def append(self, item):
"""链表尾部添加元素"""
# 创建新结点
node = Node(item)
# 是空链表就把头节点指向这个节点
if self.is_empty():
self.__head = node
else:
cur = self.__head
while cur.next is not None:
cur = cur.next
cur.next = node
def insert(self, pos, item):
"""在指定位置插入元素"""
# 位置pos在第一个元素之前,则在头部插入
if pos <= 0:
self.add(item)
# 位置pos大于总长度,则在尾部插入
elif pos > self.length():
self.append(item)
else:
# 指定位置添加元素
node = Node(item)
count = 0
pre = self.__head
# 循环定位指针位置
while count < (pos-1):
count += 1
pre = pre.next
node.next = pre.next
pre.next = node
def modify(self, pos, item):
"""修改指定位置的元素"""
# 位置pos小于等于0时,则修改头部元素
if pos <= 0:
self.__head.elem = item
# 位置pos大于总长度,则修改尾部元素
elif pos >= self.length():
pre = self.__head
# 循环指针找到尾部元素
while pre is not None:
if pre.next is None: # pre.next为None说明已经找到尾部元素了
pre.elem = item
break
else:
pre = pre.next # 不是尾部元素就继续指针指向下一个
else:
count = 0
pre = self.__head
# 循环找出位置
while count < pos: # 1.当不满足count < pos条件时,说明指针已经指向了给定pos的位置
count += 1
pre = pre.next
pre.elem = item # 2.修改元素
def remove(self, item):
"""删除节点"""
cur = self.__head
pre = None
while cur is not None:
# 找到了要删除的元素
if cur.elem == item:
# 要删除的元素就是第一个元素,就把头指针指向当前的下一个节点
if not pre:
self.__head = cur.next
else:
pre.next = cur.next
break
# 未找到要删除的元素,指向向后走,继续遍历
else:
pre = cur
cur = cur.next
def search(self, item):
"""查找节点是否存在"""
cur = self.__head
while cur is not None:
# 找到了返回True,未回到指向下一个继续遍历
if cur.elem == item:
return True
cur = cur.next
return False
if __name__ == '__main__':
ll = SingleLinkList()
print(ll.is_empty())
print(ll.length())
ll.travel()
print('append')
ll.append(10)
ll.append(12)
ll.travel()
print('add')
ll.add(9)
ll.travel()
print('insert')
ll.insert(1, 33)
ll.travel()
print('remove')
ll.remove(9)
ll.travel()
print('modify')
ll.modify(-1, 13)
ll.travel()
ll.modify(10, 44)
ll.travel()
ll.modify(1, 55)
ll.travel()
print('search')
print(ll.search(12))