Python:链表

线性表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。除了包含每个数据元素外,还存储了a_{i}后继a_{i+1}的存储位置。这两部分信息组成数据元素a_{i}的存储映像,称为结点(node)。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称作指针或链。n个结点(a_{i}(1\leqslant i\leqslant n) 的存储映像)链结成一个链表,即为线性表 

(a_{1}, a_{2},\cdots ,a_{n} )

的链式存储结构。又由于此链表的每个结点中只包含一个指针域,故又称线性链表或单链表。

1.单链表

单链表的存取必须从头指针开始进行,头指针指示链表中第一个结点(即第一个数据元素的存储映像,也称首元结点) 的存储位置。同时,由于最后一个数据元素没有直接后继,则单链表中最后一个结点的指针为空 (NULL)。

python代码实现:

class ListNode(object):
    #初始化
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
#链表的基本操作
class LinkedList(object):
    def __init__(self):
        self.head = None
    
    #判断链表是否为空
    def is_empty(self):
        return self.head == None

    #链表长度
    def length(self):
        #cur初始时指向头节点
        cur = self.head
        count = 0
        # 尾节点指向None,当未到达尾部时
        while cur != None:
            count += 1
            # 将cur后移一个节点
            cur = cur.next
        return count

    #遍历链表
    def travel(self):
        cur = self.head
        while cur != None:
            print(cur.val)
            cur = cur.next
   
    #头部添加元素
    def addhead(self, val):
        #先创建一个保存val值的节点
        node = ListNode(val)
        #将新节点的链接域next指向头节点(原链表头部),即head指向的位置
        node.next = self.head
        #将链表的头head指向新节点(构成的新链表头部)
        self.head = node

    #尾部添加元素
    #需要先遍历到最尾端,然后使next指向新的节点
    def addend(self, val):
        #先创建一个保存val值的节点
        node = ListNode(val)
        if self.is_empty():
            self.head = node
        else:
            cur = self.head
            while cur.next != None:
                cur = cur.next
            cur.next = node
       
    #指定位置插入元素
    def insertone(self, pos, val):
        #若头部插入,
        if pos <=0:
            self.addhead(val)
        #若尾部插入,若pos=3,插在第三个节点后面
        elif pos > (self.length()-1):
            self.addend(val)
        #其他位置
        else:
            node = ListNode(val)
            cur = self.head
            while (pos-1)>0:
                cur=cur.next
                pos -= 1
            node.next = cur.next 
            cur.next = node

     #根据值删除节点
     def removeval(self, val):
         cur = self.head
         pre = None
         while cur:
            if cur.val == val:
                #删除第一个节点时
                if not pos:
                    self.head = cur.next
                else:
                    pre.next = cur.next 
                break
             else:
                pre = cur
                cur = cur.next

       #删除倒数第pos个位置的节点
       def removepos(self, pos, head):
            node = ListNode(0, head)
            first = node
            second = node
            while pos>=0:
                first = first.next
                pos -= 1
            while first:
                first = first.next
                second = second.next
            second.next = second.next.next
            return node.next #返回虚拟头结点的 next,即处理后的链表的头结点。

        #检测节点是否存在
        def search(self,val):
            cur = self.head
            while cur != None:
                if cur.val == val:
                    return True
                cur = cur.next
            return False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值