zoukankan      html  css  js  c++  java
  • Python的双向链表实现

    思路

    链表由节点组成,先规定节点(Node),包含data和指向下个节点的next

    1. 初始化

      data当然就是传入的data了,next和prev指向None

    2. 添加

      分两种情况:

      1. 链表为空,那么头节点和尾节点都指向新插入的节点
      2. 链表不为空,那么直接在尾部添加即可
    3. 遍历

      因为只有链表的尾节点的next是指向None的,所以可以根据这点来从头遍历

    4. 删除某个节点

      删除的时候分4种情况:

      1. 链表为空的时候
      2. 头节点,此时更改头节点的prev
      3. 尾节点,此时只需将尾节点的前一个节点(prev)的next指向None即可
      4. 中间的节点,修改要删除的节点的前驱和后继节点的next和prev指向就好
    5. 搜寻

      遍历查找即可

    6. 清空链表

      将头节点和尾节点都置为None即可

    class Node:
        def __init__(self,data=None, next=None, prev=None):
            self.next = next
            self.prev = prev
            self.data = data
    
    class DoublyLinkedList:
        def __init__(self):
            self.head = None
            self.tail = None
            self.size = 0
    
        def append(self,data):
            '''添加元素'''
            node = Node(data,None,None)
            if self.head is None:
                self.head = node
                self.tail = self.head
            else:
                node.prev = self.tail
                self.tail.next = node
                self.tail = node   
            self.size += 1
    
        def iter(self):
            '''遍历链表'''
            current = self.head
            while current:
                value = current.data
                current = current.next
                yield value
    
        def delete(self,data):
            '''根据数据删除节点'''
            current = self.head
            node_deleted = False
            if current is None:			#链表为空
                node_deleted = False
            elif current.data == data:		#要删除的元素在链表的开头
                self.head.prev = None
                self.head = current.next
                node_deleted = True
            elif self.tail.data == data:		#要删除的元素在链表的结尾
                self.tail = self.tail.prev
                self.tail.next = None
                node_deleted = True
            else:		#要删除的元素在链表中间的某一处
                while current:
                    if current.data == data:
                        current.prev.next = current.next
                        current.next.prev = current.prev
                        node_deleted = True
                    current = current.next
            if node_deleted:	#如果有元素被删除,长度就减一
                self.size -= 1
    
        def contain(self,data):
            '''搜寻某个节点'''
            for node in self.iter():
                if data == node:
                    return True
            return False
    
        def clear(self):
            '''清空链表'''
            self.tail = None
            self.head = None
    
  • 相关阅读:
    C# String 与 byte 互转
    ajax 传值 中文乱码问题
    Js 日期处理
    sqlCacheDependency 更新缓存Cache
    SQL分割字符串,返回临时表
    E:could not get lock /var/lib/dpkg/lock -ope
    YAML-CPP
    [gazebo-1] process has died [pid 22855, exit code 255,
    gperftools对程序进行分析
    pclConfig.cmake or PCLConfig.cmake
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/9630186.html
Copyright © 2011-2022 走看看