目次
関連記事
1. 一方向リンクリスト
一方向チェーンテーブルの例の図
ノードノードには elem (要素) と next (次のノードへのポインタ) の 2 つの部分があり、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
3. 完全なコード
詳細はメモに記載してあります
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))