Pythonの一方向リンクリスト操作

目次

1. 一方向リンクリスト

一方向チェーンテーブルの例の図

 第二に、一方向リンクリストの操作

1. リンクされたリストが空かどうかを判断します。

2、リンクリストの長さ

3. リンクされたリスト全体を走査する

4. リンクされたリストの先頭に要素を追加します

5. リンクリストの最後に要素を追加します

6. 指定した位置に要素を挿入します

7. 指定した位置の要素を変更します

8. 要素の削除

9. 要素が存在するかどうかを確認する

3. 完全なコード


関連記事

Pythonの一方向リンクリスト操作

Pythonの一方向循環リンクリストの操作

Pythonの二重リンクリストの操作

Python双方向循環リンクリストの操作

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))

おすすめ

転載: blog.csdn.net/qq_37140721/article/details/130282528