python 链表实现 双向链表

  1.  双向链表的定义

    每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。

  

  2.  操作

  • is_empty() 链表是否为空
  • length() 链表长度
  • travel() 遍历链表
  • add(item) 链表头部添加
  • append(item) 链表尾部添加
  • insert(pos, item) 指定位置添加
  • remove(item) 删除节点
  • search(item) 查找节点是否存在

  3.  实现

class Node(object):
    def __init__(self,item):
        self.elem = item
        self.next = None
        self.prev = None

class DoubleLinkList(object):
    ‘‘‘
    双链表
    ‘‘‘
    def __init__(self,node=None):
        self.__head = node

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

    def length(self):
        #链表的长度
        #cur游标,用来遍历节点,count记录数量
        cur = self.__head
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        #遍历链表
        cur = self.__head
        while cur != None:
            print(cur.elem,end=‘ ‘)
            cur = cur.next
        print(‘‘)
    def add(self,item):
        #在链表头部添加节点
        node = Node(item)
        node.next = self.__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 != None:
                cur = cur.next
            cur.next = node
            node.prev = cur

  在链表指定位置插入元素

    def insert(self,pos,item):
        #在链表指定位置添加节点
        # pos从0开始
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            cur = self.__head
            count = 0
            while count < pos:
                count += 1
                cur = cur.next
            #当退出循环后,pre指向pos位置
            node = Node(item)
#            node.next = cur
#            node.prev = cur.prev
#            cur.prev.next = node
#            cur.prev = node
            node.prev = cur  #将node的prev指向cur
            node.next = cur.next  #将node的next指向cur的下一个节点
            cur.next.prev = node  #将cur的下一个节点的prev指向node
            cur.next = node  #将cur的next指向node

  移除和查找节点

    def remove(self,item):
        #移除节点
        cur = self.__head
        while cur != 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):
        #查找节点
        cur = self.__head
        while cur != None:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        return False

  完整代码:

class Node(object):
    def __init__(self,item):
        self.elem = item
        self.next = None
        self.prev = None

class DoubleLinkList(object):
    ‘‘‘
    双链表
    ‘‘‘
    def __init__(self,node=None):
        self.__head = node

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

    def length(self):
        #链表的长度
        #cur游标,用来遍历节点,count记录数量
        cur = self.__head
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        #遍历链表
        cur = self.__head
        while cur != None:
            print(cur.elem,end=‘ ‘)
            cur = cur.next
        print(‘‘)
    def add(self,item):
        #在链表头部添加节点
        node = Node(item)
        node.next = self.__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 != None:
                cur = cur.next
            cur.next = node
            node.prev = cur

    def insert(self,pos,item):
        #在链表指定位置添加节点
        # pos从0开始
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            cur = self.__head
            count = 0
            while count < pos:
                count += 1
                cur = cur.next
            #当退出循环后,pre指向pos位置
            node = Node(item)
#            node.next = cur
#            node.prev = cur.prev
#            cur.prev.next = node
#            cur.prev = node
            node.prev = cur  #将node的prev指向cur
            node.next = cur.next  #将node的next指向cur的下一个节点
            cur.next.prev = node  #将cur的下一个节点的prev指向node
            cur.next = node  #将cur的next指向node

    def remove(self,item):
        #移除节点
        cur = self.__head
        while cur != 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):
        #查找节点
        cur = self.__head
        while cur != None:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        return False

if __name__ == ‘__main__‘:
    dll = DoubleLinkList()
    print(dll.is_empty())
    print(dll.length())

    dll.append(1)
    print(dll.is_empty())
    print(dll.length())

    dll.append(2)
    dll.add(8)
    dll.append(3)
    dll.append(4)
    dll.append(5)
    dll.append(6)
    dll.insert(-1,9)
    dll.travel()
    dll.insert(3,100)
    dll.travel()
    dll.insert(10,200)
    dll.travel()
    dll.remove(100)
    dll.travel()
    dll.remove(9)
    dll.travel()
    dll.remove(200)
    dll.travel()
‘‘‘
运行结果
True
0
False
1
9 8 1 2 3 4 5 6
9 8 1 2 100 3 4 5 6
9 8 1 2 100 3 4 5 6 200
9 8 1 2 3 4 5 6 200
8 1 2 3 4 5 6 200
8 1 2 3 4 5 6
‘‘‘

  单向循环链表

  1.  单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。

    

  2.  操作

  • is_empty() 判断链表是否为空
  • length() 返回链表的长度
  • travel() 遍历
  • add(item) 在头部添加一个节点
  • append(item) 在尾部添加一个节点
  • insert(pos, item) 在指定位置pos添加节点
  • remove(item) 删除一个节点
  • search(item) 查找节点是否存在

  3.  实现

class Node(object):
    #单向循环链表节点类实现
    def __init__(self,elem):
        self.elem = elem
        self.next = None

class SingleCycleLinkList(object):
    #单向循环链表类实现
    def __init__(self,node=None):
        self.__head = node
        if node:
            node.next = node

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

    def length(self):
        #链表的长度
        if self.is_empty():
            return 0
        #cur游标,用来遍历节点,count记录数量
        cur = self.__head
        count = 1
        while cur.next != self.__head:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        #遍历链表
        if self.is_empty():
            return
        cur = self.__head
        while cur.next != self.__head:
            print(cur.elem,end=‘ ‘)
            cur = cur.next
        #退出循环,cur指向尾节点,但尾节点的元素未打印
        print(cur.elem)

    def add(self,item):
        #在链表头部添加节点
        node = Node(item)
        if self.is_empty():
            self.__head = node
            node.next = node
        else:
            cur = self.__head
            while cur.next != self.__head:
                cur = cur.next
            #退出循环,cur指向尾节点
            node.next = self.__head
            self.__head = node
            cur.next = node

    def append(self,item):
        #在链表尾部添加节点
        node = Node(item)
        if self.is_empty():
            self.__head = node
            node.next = node
        else:
            cur = self.__head
            while cur.next != self.__head:
                cur = cur.next
            node.next = self.__head
            cur.next = node

    def insert(self,pos,item):
        #在链表指定位置添加节点
        # pos从0开始
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            pre = self.__head
            count = 0
            while count < (pos-1):
                count += 1
                pre = pre.next
            #当退出循环后,pre指向pos-1位置
            node = Node(item)
            node.next = pre.next
            pre.next = node

    def remove(self,item):
        #移除节点
        if self.is_empty():
            return
        cur = self.__head
        pre = None
        while cur.next != self.__head:
            if cur.elem == item:
            #先判断此节点是否是头节点
                if cur == self.__head:
                    #头节点的情况
                    #先找到尾节点
                    rear = self.__head
                    while rear.next != self.__head:
                        rear = rear.next
                    self.__head = cur.next
                    rear.next = self.__head
                else:
                    #中间节点
                    pre.next = cur.next
                return
            else:
                pre = cur
                cur = cur.next
        #退出循环,cur指向尾节点
        if cur.elem == item:
            if cur == self.__head:
                #链表只有一个节点
                self.__head = None
            else:
                pre.next = cur.next
    def search(self,item):
        #查找节点
        if self.is_empty():
            return False
        cur = self.__head
        while cur.next != self.__head:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        #退出循环,cur指向尾节点
        if cur.elem == item:
            return True
        return False

if __name__ == ‘__main__‘:
    ll = SingleCycleLinkList()
    print(ll.is_empty())
    print(ll.length())

    ll.append(1)
    print(ll.is_empty())
    print(ll.length())

    ll.append(2)
    ll.add(8)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    ll.append(6)
    ll.insert(-1,9)
    ll.travel()
    ll.insert(3,100)
    ll.travel()
    ll.insert(10,200)
    ll.travel()
    ll.remove(100)
    ll.travel()
    ll.remove(9)
    ll.travel()
    ll.remove(200)
    ll.travel()

‘‘‘
运行结果:
True
0
False
1
9 8 1 2 3 4 5 6
9 8 1 100 2 3 4 5 6
9 8 1 100 2 3 4 5 6 200
9 8 1 2 3 4 5 6 200
8 1 2 3 4 5 6 200
8 1 2 3 4 5 6

‘‘‘
        

原文地址:https://www.cnblogs.com/homle/p/8848259.html

时间: 2024-07-30 20:16:01

python 链表实现 双向链表的相关文章

python链表

一 简介 1 链表简介 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 相比于线性表顺序结构,操作复杂.由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间

线性链表的双向链表——java实现

.线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为null. 循环链表:一种首尾相连的链表. 双向链表:每个节点有两个引用,一个指向当前节点的上一个节点,另外一个指向当前节点的下一个节点. 下面给出线性表双向链表的实现:java中LinkedList是线性表的链式实现,是一个双向链表. import java.util.NoSuchElementE

[算法]反转单向链表和双向链表

题目: 分别实现反转单向链表和双向链表的函数. 要求: 如果链表长度为N,时间复杂度为O(N),额外空间复杂度要求为O(1). 程序: 反转单向链表: public class Node{ public Node(int data){ this.value=data; } public int value; public Node next; } public static Node reverseList(Node node){ Node pre=null; Node next=null; w

栈,队列,单链表,双向链表

1. 定义头文件 实现栈方法的定义,注意这里用到了全局的静态数组,可以通过这种方式保护数据. main.c,实现存储 队列,创建头文件queue.h 创建queue.c 实现main函数 单链表 在定义头文件的时候,最好使用: #ifndef 变量A #define变量A 函数声明和结构声明等声明 #endif 通过上面的这种方式可以避免重复调用头文件时候产生的负面影响. 定义头文件link.h:(注意加上extern) 定义link.c 编写main.c 4.双向链表 创建link.h头文件

单向链表和双向链表的原理及其相关实现

(一)什么是链表? 链表是线性表的一种,所谓的 线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现.而链表不是用顺序实现的,用指针实现,在内存中不连 续.意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题. 所以,链表允许插入和删除表上任意位置上的节点,但是不允许随即存取.链表有很多种不同的类型:单向链表.双向链表及循环链表. 1.那么先从单向链表着手,先看看单向链表的模拟图: 单向链表包含两个域,一个是信息

【 C# 数据结构】(一) -------------------------- 泛型带头节点的单链表,双向链表实现

在编程领域,数据结构与算法向来都是提升编程能力的重点.而一般常见的数据结构是链表,栈,队列,树等.事实上C#也已经封装好了这些数据结构,在头文件 System.Collections.Generic 中,直接创建并调用其成员方法就行.不过我们学习当然要知其然,亦知其所以然. 本文实现的是链表中的单链表和双向链表,并且实现了一些基本方法 一. 定义一个链表接口 MyList 接口里声明了我们要实现的方法: interface MyList<T> { int GetLength(); //获取链表

【Python】python链表应用源码示例

python链表应用源码示例,需要用到python os模块方法.函数和类的应用. 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. python链表应用源码示例如下: #-*-coding:utf8 -*- import os class Head_List: def __init__(self , id): self.id = id self.next = -1 self.length = 0 def s

Python链表操作(实现)

Python链表操作 在Python开发的面试中,我们经常会遇到关于链表操作的问题.链表作为一个非常经典的无序列表结构,也是一个开发工程师必须掌握的数据结构之一.在本文中,我将针对链表本身的数据结构特点,以及链表的一些常见操作给大家做一个深入浅出的讲解,希望本文的读者能够掌握链表的操作. 1. 什么是链表? 简单地说,链表是一种无序的列表.你可以把链表里面的数据看成是随机排列的,元素之间并没有固定的先后顺序.所以,既然是无序的,那么我们就无法像操作list对象一样简单地用index来去定位和操作

用Python写单向链表和双向链表

链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表区别于单向链表的是它是由三个部分组成:存储的对象.对下一个节点的引用.对上一个节点的引用,可以实现双向遍历. 单向列表的结构如下图: head是头节点,tail是尾节点,每个节点由Data存储对象和Next对下一个节点引用组成 下面说一下单向链表插入和删除的过程. 插入一个新节点: 原理:前一个节点