zoukankan      html  css  js  c++  java
  • 单链表的实现(python)

    采用链表实现顺序表的规则如下:

    需要两个类,LNode只有两个变量 elem是保存的元素,next是下一个元素的内存地址, LList类处理增删改查等操作

    只写了 增加元素的代码,删除修改类似。

    增加元素

      增加元素分为首部,尾部,任意位置三种,

      首部,首先判断head是否为空,head不为空时将新加的元素的next 指向 原head的内存地

        

      尾部,需要通过扫描找到左后一个元素(next为None的),直接将最后一个元素的next指向新加入的元素所在的内存地址

      任意位置,例如A,B两个元素的计数分别为5,6(从0开始计数),现要将A和B之间插入一个C元素。示例图如下:

        

    修改元素:

      首部:如果只有一个一个则直接替换,如果大于1则将原首部的next设为None, 将新加元素的next设为下一个元素的内存地址

      尾部:如果只有一个一个则直接替换,如果大于1则将 i-1 个元素的next指向新加入元素的内存地址 (i为索引的最大值) 

      任意位置:加入只有A,B,C三个元素,现在用D元素替换掉B元素。将A的next指向D的内存地址,B的next设置None, D的next指向C的内存地址

        

    删除元素:

      首部:新的head为原首部的next,原首部的next设为None。

      尾部:先扫描元素找到倒数第二个元素 将 i - 1 的next设为None即可(i为最大元素值)

      任意位置:先判断替换索引值是否合法,例如A,B,C三元素要去除B,扫描找到位置后,将A的next指向C的内存地址,B的next设为None

    # -*- coding: utf-8 -*-
    
    
    class LNode():
        def __init__(self, elem, next_=None):
            self.elem = elem
            self.next = next_
    
    
    class LLlist():
        def __init__(self):
            self.head = None
    
        def is_empty(self):
            return self.head == None
    
        def count(self):
            # 计数
            count = 1
            current = self.head
            while current.next != None:
                count += 1
                current = current.next
            return count
        
        def h_add(self, elem):
            """
            向头部添加
            分三步:1、将新的值elem 加入结点,2、将新的指针指向原head,3、self.head值更新为新的结点
            """
            current = LNode(elem)
            if self.is_empty():
                self.head = current            
            else:
                current.next = self.head
                self.head = current
    
        def insert(self, index, elem):
            """
            任意位置插入
            index:索引
            elem:插入元素
            列:A,B为两个相邻元素对应索引为0,1, C为要插入元素
            分步:1、A.next = C所在内存空间的地址。2、C.next = B位置所在的内存地址
            """
            if index < 0 or index > self.count() - 1:
                raise IndexError('插入的位置不合法!')
            current = self.head
            add = LNode(elem)
            num = 0
            while current.next != None:
                if num == index - 1:
                    up = current.next
                    current.next = add
                num += 1
                if index == num:
                    add.next = up
                    break
                current = current.next
    
        def travel(self):
            current = self.head
            while current != None:
                print current.elem
                current = current.next
                
        def h_end(self, elem):
            # 向尾部添加
            current1 = LNode(elem)
            current2 = self.head
            if self.head == None:
                self.head = current1
            else:
                while current2.next != None:
                    current2 = current2.next
                current2.next = current1
    
    
    a = LLlist()
    for x in range(1,3):
        a.h_add(x)
    a.h_end(200)
    a.h_add('aaa')
    a.insert(2,300)
    a.travel()

      

  • 相关阅读:
    黄聪:Delphi 中的 XMLDocument 类详解(6) 访问节点属性
    黄聪:Delphi 中的 XMLDocument 类详解(8) 添加与删除节点
    黄聪:Delphi 中的 XMLDocument 类详解(15) 创建与保存 xml
    黄聪:Delphi 中的 XMLDocument 类详解(9) 关于 HasChildNodes 与 IsTextElement
    黄聪:Delphi 中的 XMLDocument 类详解(4) 获取根目录下的元素数
    黄聪:Delphi 中的 XMLDocument 类详解(14) 遍历 XML 文件
    黄聪:Delphi 中的 XMLDocument 类详解(13) 关于 XML 属性
    黄聪:Delphi 中的 XMLDocument 类详解(3) 读取 xml 文件
    黄聪:Delphi 中的 XMLDocument 类详解(20) 动态建立 XMLDocument 对象
    黄聪:Delphi 中的 XMLDocument 类详解(5) 获取元素内容
  • 原文地址:https://www.cnblogs.com/bianjing/p/10144992.html
Copyright © 2011-2022 走看看