(Python)数据结构:单向链表的插删改查遍历等操作及部分异常处理

"""以下为代码正文:"""

# coding:utf-8

class Node(object):

"""定义节点类"""

    def __init__(self, elem):

        self.elem = elem

        self.next = None

class SinglyLinkedList(object):

"""定义单向链表类"""

    def __init__(self, node=None):

        self.__head = node

    def is_empty(self):

"""判断链表是否为空"""

        return self.__head == None

    def length(self):

"""计算链表长度"""

        cursor = self.__head

        count = 0

        while cursor != None:

            count += 1

            cursor = cursor.next

        return count

    def travel(self):

        """Ergodic the whole list"""

        cursor = self.__head

        while cursor != None:

            print(cursor.elem, end=" ")

            cursor = cursor.next

        print("")

    def add(self, item):

        """Adds an element at the head"""

        node = Node(item)

        node.next = self.__head

        self.__head = node

    def append(self, item):

        """Adds an element at the end"""

        node = Node(item)

        if self.is_empty():

            self.__head = node

        else:

            cursor = self.__head

            while cursor.next != None:

                cursor = cursor.next

            cursor.next = node

    def insert(self, pos, item):

        """Adds an element at the specified position"""

        cursor = self.__head #The tutor defined a 'pre' instead of 'cursor'

        node = Node(item)

        count = 0

        if pos <= 0:

            self.add(item)

        elif pos > self.length()-1:

            self.append(item)

        else:

            while count < (pos-1):

                count += 1

                cursor = cursor.next

            node.next = cursor.next

            cursor.next = node

    def remove(self, item):

        """Removes a node"""

        node = Node(item)

        cursor = self.__head

        if self.search(item) and self.__head.elem == item:

            self.__head = cursor.next

            print("-----%d is removed!-----"%item)

        elif self.search(item) and self.__head.elem != item:

            while cursor.next != None:

                if cursor.next.elem == item:

                    print("cursor.next.elem:%d"%item)

                    cursor.next = cursor.next.next

                    print("cursor: %s"%cursor.elem)

                else:

                    cursor = cursor.next

            print("======%d is removed!======="%item)

        else:

            print("%d doesn't exist."%item)

    def search(self, item):

        """查找节点是否存在"""

        cursor = self.__head

        while cursor != None:

            if cursor.elem == item:

                return True

            else:

                cursor = cursor.next

        return False

"""以下为功能测试:"""

if __name__ == "__main__":

    sll = SinglyLinkedList()

    print(sll.is_empty())

    print(sll.length())

    sll.append(1)

    print(sll.is_empty())

    print(sll.length())

    sll.append(2)

    sll.append(3)

    sll.append(4)

    sll.append(5)

    sll.add(9)

    sll.append(6)

    sll.append(7)

    sll.append(8)

    sll.insert(-5, 10)

    sll.insert(6, 11)

    sll.insert(7, 11)

    sll.insert(8, 11)

    sll.insert(100, 12)

    print(sll.length())

    print(sll.search(12))

    sll.travel()

    sll.remove(9)

    sll.travel()

    sll.remove(12)

    sll.travel()

    sll.remove(11)

    sll.travel()

    sll.remove(8)

    sll.travel()

    sll.remove(3)

    sll.travel()

    sll.remove(10)

    sll.travel()

    sll.remove(20)

    sll.travel()

    sll.remove(9)

    sll.travel()

测试过程中,在remove操作时曾出现过如下异常:AttributeError: 'NoneType' object has no attribute 'elem'.

异常原因:未对链表头部进行专门处理,且游标定义不够准确,现已改正,见上文remove函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。