python---双链表的常用操作
class Node(object):
    """结点"""
    def __init__(self, data):
        self.data = data
        self.pre = None
        self.next = None
class DoubleLinkList(object):
    """双链表"""
    def __init__(self, node=None):
        self.__head = node
    def is_empty(self):
        """判断链表是否为空"""
        return self.__head is None
    def length(self):
        """链表的长度"""
        count = 0
        cur = self.__head
        while cur is not None:
            count += 1
            cur = cur.next
        return count
    def travel(self):
        """遍历整个链表"""
        cur = self.__head
        while cur is not None:
            print(cur.data, end="")
            cur = cur.next
        print()
    def add(self, item):
        """头插"""
        node = Node(item)
        # 空链表头插
        if self.is_empty():
            self.__head = node
        # 非空链表头插
        else:
            node.next = self.__head
            self.__head.pre = node
            self.__head = 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.pre = cur
    def insert(self, pos, item):
        """指定位置插入"""
        if pos <= 0:
            self.add(item)
        elif pos > self.length() - 1:
            self.append(item)
        else:
            node = Node(item)
            cur = self.__head
            count = 0
            # 找到指定位置的前一个结点
            while count < pos - 1:
                cur = cur.next
                count += 1
            node.next = cur.next
            node.pre = cur
            cur.next = node
            node.next.pre = node
    def remove(self, item):
        """删除指定结点"""
        cur = self.__head
        while cur is not None:
            # 找到要删除的结点
            if cur.data == item:
                # 如果要删除的结点是头结点
                if cur == self.__head:
                    self.__head = cur.next
                    # 判断链表是否只有一个结点
                    if cur.next:
                        cur.next.pre = None
                # 要删除的结点不是头结点
                else:
                    cur.pre.next = cur.next
                    # 判断要删除的结点是否是尾结点
                    if cur.next:
                        cur.next.pre = cur.pre
                return
            else:
                cur = cur.next
    def search(self, item):
        """查找结点是否存在"""
        cur = self.__head
        while cur is not None:
            if cur.data == item:
                return True
            else:
                cur = cur.next
        return False
if __name__ == '__main__':
    sll = DoubleLinkList()
    print(sll.is_empty())
    print(sll.length())
    sll.add(1)
    sll.remove(1)
    print(sll.is_empty())
    print(sll.length())
    sll.append(2)
    sll.append(3)
    sll.append(4)
    sll.append(5)
    sll.travel()  # 2345
    print(sll.length())  # 4
    sll.add(99)  # 99 2345
    sll.travel()
    print(sll.length())  # 5
    print(sll.search(6))  # False
    print(sll.search(4))  # True
    sll.remove(5)
    sll.travel()  # 99 234
												
											python---双链表的常用操作的更多相关文章
- 超详细!盘点Python中字符串的常用操作
		
在Python中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a = 'abc' b= "abc" c = '''abc''' d = " ...
 - Python 基礎 - 字符串常用操作
		
字符串常用操作 今天就介紹一下常用的字符串操作,都是以 Python3撰寫的 首字母變大寫 #!/usr/bin/env python3 # -*- coding:utf-8 -*- name = & ...
 - python基础之列表常用操作及知识点小结
		
列表(list) List(列表) 是 Python 中使用最频繁的数据类型.列表可以完成大多数集合类的数据结构实现.它支持字符,数字,字符串甚至可以包含列表(所谓嵌套).列表用[ ]标识,是pyth ...
 - python数据类型:字典dict常用操作
		
字典是Python语言中的映射类型,他是以{}括起来,里面的内容是以键值对的形式储存的: Key: 不可变(可哈希)的数据类型.并且键是唯一的,不重复的. Value:任意数据(int,str,boo ...
 - Python列表类型及常用操作
		
Python列表类型 1.用途: 存放多个值,可以根据索引存取值 2.定义方式: 在[ ]内用逗号分割开多个任意类型的值 l=['yven','law','lyf'] #l=list(['yven', ...
 - 『无为则无心』Python序列 — 18、Python列表概念及常用操作API
		
目录 1.列表的概念 (1)列表的定义 (2)列表的应用场景 (3)列表的定义格式 2.列表的常用操作 (1)列表的查找 1)通过下标查找 2)通过方法查找 3)判断是否存在 (2)列表的增加 @1. ...
 - python 异常处理、文件常用操作
		
异常处理 http://www.jb51.net/article/95033.htm 文件常用操作 http://www.jb51.net/article/92946.htm
 - Python基础灬文件常用操作
		
文件常用操作 文件内建函数和方法 open() :打开文件 read():输入 readline():输入一行 seek():文件内移动 write():输出 close():关闭文件 写文件writ ...
 - python字符串、元组常用操作
		
常用字符串操作函数: #Author:CGQ name="I \tam ChenGuoQiang" print(name.capitalize())#首字母大写,其他都小写 pri ...
 
随机推荐
- LGP5279题解
			
这题好牛逼啊... 虽然说也是 DP 套 DP,但是感觉比 TJOI 那题高明到哪里去了( 我们先考虑如何计算期望.如果设 \(f_i\) 为拿到 \(i\) 张牌后胡的方案数,这个并不是很好做,因为 ...
 - AQS 源码解读之加锁篇
			
以 ReentrantLock 创建的非公平锁为基础,进行 AQS 全流程的分析. 分析 demo 一共有 A.B.C 三个线程. public class AQSDemo { // 带入一个银行办理 ...
 - CentOS7.5环境下Docker基本操作
			
1. 查找Docker中Centos镜像文件 docker search centos 2. 下载Docker中Centos镜像文件(默认下载最新版本) docker pull centos 3. ...
 - spring——IOC理论
			
这里主要是对于IOC理论提出的一个认识 dao接口 public interface Fruit { String getFruit(); } dao接口的实现类 public class Fruit ...
 - P5018 [NOIP2018 普及组] 对称二叉树
			
P5018 [NOIP2018 普及组] 对称二叉树 题目 P5018 思路 通过hash值来判断左右树是否相等 \(hl[i]\) 与 \(Hl[i]\) 是防止hash冲突, \(r\) 同理 注 ...
 - String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
			
没有.因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象.在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行 ...
 - 使用Pycharm IDE工具,使用input()函数出现>?符号
			
Python Console === 如果你是要Pycharm开发Python项目时,出现使用input函数,提示 >? 符号的时候,那应该是开启了Python Console控制台输出,取 ...
 - java-idea创建maven管理web项目不能解析EL的解决方法
			
默认会原样输出: 这是由于这样子创建的web.xml的版本不够高 2.5之前web.xml文件中的头定义中,el表达式默认是忽略不解析的,故需要显示声明解析el表达式 所以我们要修改版本: 再< ...
 - ACL 权限控制机制 ?
			
UGO(User/Group/Others) 目前在 Linux/Unix 文件系统中使用,也是使用最广泛的权限控制方式.是一种粗 粒度的文件系统权限控制模式. ACL(Access Control ...
 - 全页缓存FPC?
			
除基本的会话 token 之外,Redis 还提供很简便的 FPC 平台.回到一致性问题, 即使重启了 Redis 实例,因为有磁盘的持久化,用户也不会看到页面加载速度的 下降,这是一个极大改进,类似 ...