python 数据结构与算法 双向链表

利用python实现了双向链表,方法如下

1 is_empty() 判断链表是否为空

2 clear() 清空链表

3 len() 链表的长度

4 iteration() 遍历链表返回一个链表内容的list

5 leftappend(item) 从头部插入一个 节点

6 append(item) 从尾部追加一个节点

7 exist(item) 判断item是否在链表中

8 insert(index,item) 指定位置插入

9 remove(item) 删除内容为item的节点

具体如代码


class Node(object):
    """双向链表节点"""
    def __init__(self,item):
        self.item = item
        self.next = None
        self.prev = None


class DLinkList(object):
    """双向链表"""
    def __init__(self):
        self.__head = None
        self.__len = 0

    def is_empty(self):
        """判断链表是否为空"""
        return self.__head == None

    def clear(self):
        """清空链表"""
        self.__head = None
        self.__len = 0

    def __len__(self):
        """返回链表的长度"""
        return self.__len

    def iteration(self):
        """遍历链表"""
        cursor = self.__head

        res_list = []

        while cursor != None:
            res_list.append(cursor.item)
            cursor = cursor.next
        return res_list

    def leftappend(self,item):
        """从头部添加一个节点"""
        new_node = Node(item)

        if self.is_empty():
            self.__head = new_node
        else:
            # new_node.next 指向self.__head
            new_node.next = self.__head
            # self.__head.prev指向new_node
            self.__head.prev = new_node
            # self.__head 指向new_node
            self.__head = new_node
        self.__len += 1

    def append(self,item):
        """从尾部追加"""
        new_node = Node(item)

        if self.is_empty():
            self.__head = new_node
        else:
            cursor = self.__head

            while cursor.next != None:
                cursor = cursor.next
            # 最后一个节点的next指向new_node
            cursor.next = new_node
            # new_node的prev指向cursor
            new_node.prev = cursor
        self.__len += 1

    def exist(self,item):
        """查找item是否存在于链表中"""
        cursor = self.__head

        while cursor != None:
            if cursor.item == item:
                return True
            cursor = cursor.next
        return False

    def insert(self,index,item):
        """在指定位置插入节点"""
        if index <= 0:
            self.leftappend(item)
        elif index >= self.__len:
            self.append(item)

        else:
            new_node = Node(item)

            i = 0
            cursor = self.__head

            while i < index - 1:
                i += 1
                cursor = cursor.next
            # 把new_node插入到cursor的后面
            # 新节点的next指向游标的next
            new_node.next = cursor.next
            # 新节点的prev指向游标
            new_node.prev = cursor
            # 游标的next的Prev指向新节点
            cursor.next.prev = new_node
            # 游标的next 指向新节点
            cursor.next = new_node
            self.__len += 1

    def remove(self,item):
        if not self.exist(item):
            return
        else:
            cursor = self.__head

            while cursor != None:
                if cursor.item == item:
                    # 判断是否为头节点,头节点的prev都为空
                    if cursor.prev == None:
                        self.__head = cursor.next
                        if cursor.next:
                            # 头节点的prev都为空
                            cursor.next.pre = None
                    else:
                        cursor.prev.next = cursor.next
                        # 如果存在下一个节点则设置下一个节点的prev
                        if cursor.next:
                            cursor.next.prev = cursor.prev
                    break
                else:
                    cursor = cursor.next
            self.__len -= 1


if __name__ == '__main__':
    dlinklist = DLinkList()
    print(len(dlinklist))
    print(dlinklist.is_empty())
    dlinklist.leftappend(1)
    print(dlinklist.exist(1))
    print(len(dlinklist))
    print(dlinklist.is_empty())
    print(dlinklist.iteration())
    dlinklist.leftappend(2)
    dlinklist.append(3)
    print(dlinklist.iteration())
    dlinklist.insert(0,5)
    print(dlinklist.iteration())
    dlinklist.insert(2,4)
    print(dlinklist.iteration())
    dlinklist.insert(4,7)
    print(dlinklist.iteration())
    dlinklist.remove(7)
    print(dlinklist.iteration())
    print(dlinklist.is_empty())
    print(len(dlinklist))
    dlinklist.clear()
    print(len(dlinklist))
    print(dlinklist.is_empty())

    # 0
    # True
    # True
    # 1
    # False
    # [1]
    # [2, 1, 3]
    # [5, 2, 1, 3]
    # [5, 2, 4, 1, 3]
    # [5, 2, 4, 1, 7, 3]
    # [5, 2, 4, 1, 3]
    # False
    # 5
    # 0
    # True

猜你喜欢

转载自blog.csdn.net/ruguowoshiyu/article/details/82891529