单链表基本操作Python实现

最近在学数据结构的C语言实现,同时希望加深自己对数据结构的理解,想要用Python也实现一下,但是Python实现相比C实现代码显得简而易懂。

链表的定义

采用链式存储结构的线性表称为链表

分类

从链接方式:单链表、循环链表、双链表

结点类:

Node(结点)有两个域,一个是数据域(存值),另外一个是指针域(存地址)
其中头结点的数值域通常不存储值
给一个带头结点的单链表的例子:
带头结点的单链表
结点的指针域存的是下一个结点的存储地址:
在这里插入图片描述

尾插法

即将一个结点插入到链表的末尾。
先将待插入结点的指针域指向尾结点的指针域指向的存储位置(即None),再将尾结点的指针域指向待插入结点
在这里插入图片描述

头插法

即将一个结点插入到链表的头。
先将待插入结点的指针域指向头结点的指针域指向的存储位置(即c2),再将头结点的指针域指向待插入结点
在这里插入图片描述

Aclass Node:                      #结点类
   def __init__(self,data):
      self._data = data
      self._next = None

class LinkList:                     #链表类
   def __init__(self):
      self._head = Node(None)
      self._tail = self._head
      self._len = 0

   def addNode_tail(self,data): #尾插法插入结点
      new_node = Node(data)   #实例化一个结点
      self._tail._next  = new_node   #修改尾结点的指针域
      self._tail = new_node   #修改尾结点位置
      self._len +=1

   def addNode_head(self,data):#头插法插入结点
      new_node = Node(data)   #实例化一个结点
      new_node._next = self._head._next   #修改插入结点的指针域
      self._head._next = new_node #修改头结点的指针域
      self._len +=1
      
   def insertNode(self,data,pos):#在第pos个结点前插入结点
      if pos > self._len or pos < 1:
         print("inputs pos is error!")
         return False
      else:
         temp = self._head
         ins_node = Node(data)
         for i in range(pos-1):   #找到第pos-1个结点,即目标结点的前结点,然后尾插
            temp = temp._next
         ins_node._next = temp._next
         temp._next =ins_node
         self._len +=1
         return True

   def  delnode_pos(self,pos=1):  #删除第pos个结点,默认删除第一个
      if pos > self._len or pos <1:
         print("inputs pos is error!")
         return False
      if pos == 1:
         self._head._next = sef._head._next._next
         self._len  -=1
      else:
         temp = self._head
         for i in range(pos-1):  #找到待删除结点的前一个结点
            temp = temp._next  
         temp._next = temp._next._next   #修改其指针域,即略过待删除结点
         self._len  -=1
      return True

   def printLink(self):                         #打印链表
      temp = self._head._next
      for i in range(self._len):
         print(temp._data,end = "->")
         temp = temp._next
      print("None")

   def changeNodeData(self,pos,data): #改变结点数据
      if pos > self._len or pos <1:
         print("inputs pos is error!")
         return False
      temp = self._head
      for i in range(pos):
         temp = temp._next
      temp._data = data
      return True
      
   def getNodeData(self,pos):           #返回结点的数据
      if pos > self._len or pos <1:
         print("inputs pos is error!")
         return False
      temp = self._head
      for i in range(pos):
         temp = temp._next
      return temp._data

   def getLinkLen(self):           #返回链表长度
      return self._len


   def reverseLink(self):           #链表反转(实质也就是将原来的链表重新进行头插建表)
      temp = self._head._next._next._next
      pre = self._head._next._next
      self._tail = self._head._next
      self._tail._next = None
      while temp:
         pre._next = self._head._next
         self._head._next = pre
         pre = temp
         temp = temp._next
      pre._next = self._head._next
      self._head._next = pre
      return True

   def connectLink(self,link): #连接两个链表
      self._tail._next  = link._head._next
      self._len = self._len + link._len
      return True
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值