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
    
  • 相关阅读:
    sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
    busybox程序连接 ln怎么回事?怎样实现的
    有线网卡与无线网卡同时使用
    "$(@:_config=)"
    C#中Global文件
    Win7 IIS7 HTTP 错误 404.2 Not Found解决方法
    C#中的日期处理函数
    js字母大小写转换
    asp.net发布到IIS中出现错误:处理程序“PageHandlerFactoryIntegrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
    sql server在存储过程中使用游标和事务
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/9630186.html
Copyright © 2011-2022 走看看