zoukankan      html  css  js  c++  java
  • 实现链表的完整代码

    
    # 这个只是next来赋值变量给另外一个,有点复杂,头晕,变量太多了
    class Node:
        '''
        单向链表的节点包含两部分,一部分是存放数据的变量data
        另一部分是指向下一个节点的指针next
        '''
        def __init__(self,data):
            '''
            只有头节点,next指针为空
            '''
            self.data = data
            self.next = None
    # 而双向链表除了拥有data和next指针外
    # 还拥有指向前置节点的prev指针   
    # a = Node(1)
    # print(a)
    # print(a.next)
    # print(a.data) 
    class LinkedList:
        '''
        链表的第一个节点称为头节点
        最后一个节点称为尾节点
        尾节点的next指针指向空
        链表寻找元素,只能根据前一个节点的next指针指向后一个节点
        '''
        def __init__(self):
            self.size = 0
            self.head = None
            self.last = None
    
        def get(self,index): # O(n)
            if index < 0 or index >= self.size: # 链表这里为啥要等于呢
                raise Exception("超出链表节点范围!")
            p = self.head
            for i in range(index): # 链表中节点的查询操作要从头节点开始,一个一个next指针查下去
                p = p.next
            return p
    
        def insert(self,data,index): #O(1)
            '''
            只要执行插入操作,self.size加一
            '''
            if index < 0 or index > self.size:
                raise Exception('超出链表节点范围!')
            node = Node(data) # 这里的node具有头节点和next指针,头节点就是data数据,next为空
            if self.size == 0:
                # 空链表
                self.head = node # 新插入的节点为头节点
                self.last = node # 新插入的节点为尾节点
            elif index == 0:
                # 插入头部
                node.next = self.head # 对称交叉互换;把新节点的next指针指向原先的头节点;后面链接前面
                self.head = node # 把新节点变为链表的头节点
            elif self.size == index:
                # 插入尾部
                self.last.next = node # 最后一个节点的next指针指向新插入的节点;后面链接前面
                self.last = node # 新插入的节点等于最后一个节点
            else:
                # 插入中间
                prev_node = self.get(index-1)
                # 两个next指针相等为啥;后面链接前面,也就是data连接next
                node.next = prev_node.next # prev_node原本后面的data元素指向node的next指针
                prev_node.next = node #插入位置前置节点的next指针指向新节点 
            self.size  += 1
    
        def remove(self,index):# O(1)
            '''
            只要执行删除操作,self.size减1
            '''
            if index < 0 or index >= self.size:
                raise Exception('超出链表节点范围!')
            # 暂存被删除的节点,用于返回
            if index == 0:
                # 删除头节点
                remove_node = self.head
                self.head = self.head.next # 把第二个节点设置为头节点
                if self.size == 1:
                    self.last == Node
            elif index == self.size - 1:
                # 删除尾节点
                prev_node = self.get(index-1)
                # remove_node = prev_node
                remove_node = self.get(index) # 这才是要指定要删除的节点
                prev_node.next = None # 倒数第二个节点指向空,也就是None
                self.last = prev_node # 最后一个节点设置为到数第二个节点
            else:
                # 删除中间节点
                prev_node = self.get(index-1)
                next_node = prev_node.next.next # 把要删除的前置节点的后2位节点数据找到
                remove_node = prev_node.next # 前置节点的后一位节点解释要删除的节点
                prev_node.next = next_node # 前置节点的后2位节点等于前置节点的next指针;也可以说前置节点的next指针指向后2位节点的数据
            self.size -= 1
            # print(remove_node)
            return remove_node # remove_node打印出来是这个<__main__.Node object at 0x000002B1C6389438>
            
    
        def output(self): # 难道是由于链表只能一个一个next输出;还是从头节点开始一个一个输出出来
            p = self.head
            while p is not None:
                print(p.data)
                p = p.next
    
    linkedList = LinkedList()
    linkedList.insert(3,0)    
    linkedList.insert(4,0)    
    linkedList.insert(9,2)
    linkedList.insert(5,3)
    linkedList.insert(6,1)
    print(linkedList.remove(1)) # remove删除的具体值打印不出来
    print('---------------')
    linkedList.output()
    
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    包图网+千图网图片代下
    Java基于二维数组自定义的map
    java23种设计模式-行为型模式-中介者模式
    基于SpringBoot、Redis和RabbitMq的商品秒杀处理
    wps+稻壳vip账号免费分享
    wps+稻壳vip15天领取地址
    图精灵、易图、笔图,vip免费分享
    文库、氢元素、办图、六图,vip免费分享
    快图网、千库,go设计,vip免费分享
    MySQL索引规范及优化
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15325736.html
Copyright © 2011-2022 走看看