python双向链表的概念介绍

美女程序员鼓励师

说明

1、更复杂的链表是双向链表或双面链表。每个节点有两个链接:一个指向前一个节点,这个节点是第一个。

2、一个节点指向空值,另一个指向下一个节点,当该节点指向最后一个节点时指向空值。

操作方法

is_empty()链表是否为空。

length(链表长度。

travel)经历链表。

添加add(item)链表头部。

添加到append(item)链表的尾部。

添加insert(pos、item)指定位置。

remove删除节点。

搜索节点是否存在。

实例

class Node(object):

    def __init__(self, elem):

        """

        :param elem: 表元素域

        next:下一结点链接域

        cursor(cur):游标

        """

        self.elem = elem

        # 定义next指向空

        self.next = None

        # 定义next指向空

        self.prev = None

 

 

class DoubleLinkList(object):

    """

    一种更复杂的链表是“双向链表"或“双面链表"。每个节点有两个链接: 一个指向前一个节点,当此节点为第

    一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。

    """

 

    def __init__(self, node=None):

        self._head = node  # node.elem node.next

 

    def is_empty(self):

        """链表是否为空   """

        return self._head is None

 

    def length(self):

        """链表长度"""

        # cur游标,用来移动遍历节点

        cur = self._head

        count = 0

        while cur is not None:

            count += 1

            cur = cur.next

            # count 记录数量

        return count

 

    def travel(self):

        """遍历整个链表"""

        cur = self._head

        while cur is not None:

            print(cur.elem, end=' ')

            cur = cur.next

 

    def add(self, item):

        """链表头部添加元素:头插法"""

        node = Node(item)

        # node的next指向_head

        node.next = self._head

        # _head指向新节点

        self._head = node

        node.next.prev = 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

            node.prev = cur

 

    def insert(self, pos, item):

        """

        pos: pos从0开始

        pre:指定节点前一节点,相当于游标

        node:插入的指定节点

        指定位置添加元素

        """

        # if pos<=0 头插法

        if pos <= 0:

            self.add(item)

        # elif pos>(self.length()-1) 尾插法

        elif pos > (self.length() - 1):

            self.append(item)

        # else 插入法

        else:

            cur = self._head

            count = 0

            # 当循环退出后,cur指向pos

            while count < pos:

                count += 1

                cur = cur.next

            # 当循环退出后,cur指向pos位置

            node = Node(item)

            # 方式1:

            node.next = cur

            node.prev = cur.prev

            cur.prev.next = node

            cur.prev = node

            # 方式2:

            # node.next = cur

            # node.prev = cur.prev

            # cur.prev = node

            # node.prev.next = node

 

    def remove(self, item):

        """删除元素"""

        # 考虑删除头部、尾部、中间节点

        cur = self._head

        while cur is not None:

            if cur.elem == item:

                # 先判断是否是头节点

                if cur == self._head:

                    self._head = cur.next

                    if cur.next:  # 判断链表表是否只有一个节点

                        cur.next.prev = None

                else:

                    cur.prev.next = cur.next

                    if cur.next:  # 判断链表是否是最后一个节点

                        cur.next.prev = cur.prev

                break

            else:

                cur = cur.next

 

    def search(self, item):

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

        # 1. 创建游标

        cur = self._head

        # 2. 遍历游标

        while cur is not None:

            # 3. cur.elem = item

            if cur.elem == item:

                return True

            else:

                cur = cur.next

        return False

 

 

if __name__ == '__main__':

    DLL = DoubleLinkList()

    DLL.is_empty()

    l1 = DLL.length()

    print(l1)

 

    DLL.append(55)

    DLL.is_empty()

    l2 = DLL.length()

    print(l2)

 

    DLL.append(2)

    DLL.add(8)

    DLL.append(3)

    DLL.append(4)

    DLL.append(5)

    # 55 1 8 2 3 4

    DLL.insert(-1, 9)  # 9 8 55 2 1 8 2345

    DLL.insert(2, 100)  # 9 8 100 55 2 1 8 2345

    DLL.travel()

以上就是python双向链表的概念介绍,希望对大家有所帮助。更多Python学习指路:python基础教程

本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。

以上是 python双向链表的概念介绍 的全部内容, 来源链接: utcz.com/z/544641.html

回到顶部