数据结构--链表

链表

链表是常见的一种数据结构,其中每个节点都分为数据域和指针域,指针域存储的为下一节点的地址。
在这里插入图片描述

1、节点的定义

class Node:
    '''
    定义节点
    '''
    def __init__(self, initData):
        self.data = initData 
        self.next = None

    def getData(self):
        return self.data

    def getNext(self):
        return self.next

    def setData(self, newData):
        self.data = newData

    def setNext(self, newNext):
        self.next = newNext

2、初始化一个空链表

链表的初始化,定义了一个头指针,并使头指针为None

class linkList:
    def __init__(self):
        self.head = None

3、链表的操作

链表的操作包括插入(从头部插入、从指定位置插入),删除(从头部删除、从指定位置删除),查找等。

3.1、头部插入

def insertDataFront(self, newData):
    newdata = Node(newData)		# 将新元素值转为新节点
    newdata.setNext(self.head)	# 将头指针指向的地址赋值给新节点的指针域
    self.head = newdata			# 将新节点的地址赋值给头指针

3.2、指定位置插入

def insertData(self, newData, indexNum):
    if indexNum == 1:		# 在第一个位置插入即为在头部插入
        linkList.insertDataFront(self, newData)
    else:
        newdata = Node(newData)
        p = self.head		# 将头指针赋值给一个新指针
        #	通过循环找到插入位置(指定位置的前一个),期间指针p不断移动
        for i in range(1, indexNum):
            if p is None:
                print('非法插入位置')
                break
            if indexNum - 1 != i:
                p = p.getNext()
        newdata.setNext(p.getNext())	# 将p指针指向的节点的指针域赋值给新节点的指针域
        p.setNext(newdata)				# 将新节点的地址赋值给p指向的节点的指针域

3.3、删除

删除过程与插入过程类似。

# 从链表的头部删除
def rmNodeFront(self):
    self.head = self.head.getNext()

# 删除指定位置节点
def rmNode(self, indexNum):
    if indexNum == 1:
        linkList.rmNodeFront(self)
    else:
        p = self.head
        for i in range(1, indexNum):
            if p is None:
                print('非法删除位置')
                break
            if indexNum - 1 != i:
                p = p.getNext()
        q = p.getNext()
        p.setNext(q.getNext())
        q.setNext(None)

3.4、查找

# 查找某个元素是否在链表中
# 指针不断移动,每次移动比较p指向的节点的数据域的值是否与要查找的值相等
def searchNode(self, targetNum):
    p = self.head
    while p is not None:
        if p.getData() == targetNum:
            print('此链表中存在', targetNum)
            break
        elif p.getNext() is None:
            print('此链表中不存在', targetNum)
            break
        else:
            p = p.getNext()

3.5、其他一些操作

# 链表长度
def linkListLength(self):
    count = 0
    p = self.head
    while p is not None:
        count = count + 1
        p = p.getNext()
    return count

def isEmpty(self):
    return self.head is None

# 输出链表
def printLinkList(self):
    linklist = []
    p = self.head
    while p is not None:
        linklist.append(p.getData())
        p = p.getNext()
    return linklist

3.6、测试

if __name__ == '__main__':
    l = linkList()

    # 插入数据(链表头部)
    l.insertDataFront(2)
    l.insertDataFront(3)
    l.insertDataFront(4)
    print(l.printLinkList())

    # 在第2个位置插入
    l.insertData(5, 2)
    print(l.printLinkList())

    # 从链表头部删除
    l.rmNodeFront()
    print(l.printLinkList())

    # 删除第1个位置节点
    l.rmNode(1)
    print(l.printLinkList())

    # 在第1个位置插入
    l.insertData(100, 1)
    print(l.printLinkList())

    print('链表长度为:', l.linkListLength())

    l.searchNode(3)
    l.searchNode(5)

结果:

[4, 3, 2]
[4, 5, 3, 2]
[5, 3, 2]
[3, 2]
[100, 3, 2]
链表长度为: 3
此链表中存在 3
此链表中不存在 5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值