Python 实现单向链表的插入、删除

插入节点

在单向链表中插入一个新节点有三种情况:
1.加到头结点之前
2.加到链表末尾
3.加到链表中间任意一个位置
solution1:.加到头结点之前

newnode.next=first
first=newnode

solution2:加到链表末尾

ptr.next=newnode
newnode.next=None

solution3:.加到链表中间任意一个位置

newnode.next=x.next
x.next=newnode

exercise:
设计一个Python程序,建立员工单向链表,并允许在链表头、尾、中三种不同位置插入新节点。最后离开,列出链表内容:

import sys

class employee:
    def __init__(self):
        self.num=0
        self.salary=0
        self.name=' '
        self.next=None
        


def findnode(head,num):
    ptr=head
    while ptr!=None:
        if ptr.num==num:
            return ptr
        ptr=ptr.next
    return ptr

def insertnode(head,ptr,num,salary,name):
    Insertnode=employee()
    if not Insertnode:
        return None
    Insertnode.num=num
    Insertnode.name=name
    Insertnode.salary=salary
    Insertnode.next=None
    if ptr==None:#插入第一个节点
        Insertnode.next=head
        return Insertnode
    else:
        if ptr.next==None:#插入最后一个节点
            ptr.next=Insertnode
        else:
            Insertnode.next=ptr.next
            ptr.next=Insertnode
    return head

position=1
data=[[1001,32678],[1002,23789],[1003,39087],[1004,46789],[1007,32908],[1020,31214]]
namedata=['Allen','Scott','Nelle','Mark','Deny','Bob']
print('员工编号 薪水  员工编号 薪水')
print('________________________________________________________________________')
for i in range(3):
    for j in range(2):
        print('[%4d]\t$%5d'%(data[j*3+i][0],data[j*3+i][1]),end=' ')
    print()
print('_________________________________________________________________________')

head=employee()#建立头结点
head.next=None

if not head:
    print('Error!!内存分配失败')
    sys.exit(1)         #程序有错误退出
head.num=data[0][0]
head.name=namedata[0]
head.salary=data[0][1]
head.next=None
ptr=head
for i in range(1,6):#建立链表
    newnode=employee()
    newnode.num=data[i][0]
    newnode.name=namedata[i]
    newnode.salary=data[i][1]
    newnode.next=None
    ptr.next=newnode
    ptr=newnode

while(True):
    print('请输入要插入其后员工编号,如果输入的编号不在链表中,')
    position=int(input('新输入的员工节点将视为此链表的链表头部,要结束过程,输入-1:'))
    if position==-1:
        break
    else:
        ptr=findnode(head,position)
        new_num=int(input('请输入新插入的员工编号:'))
        new_salary=int(input('请输入新插入的员工薪水:'))
        new_name=input('请输入新插入的员工名字:')
        head=insertnode(head,ptr,new_num,new_salary,new_name)
    print()

ptr=head
print('员工编号  姓名\t薪水')
print('________________________________________')
while ptr!=None:
    print('[%2d]\t[%-5s]\t[%3d]'%(ptr.num,ptr.name,ptr.salary))
    ptr=ptr.next
 

        

结果:
在这里插入图片描述

删除节点:

三种情况:
solution1:
删除链表的第一个节点:

top=head
 head=head.next

solution2:
删除链表的最后一个节点:

ptr.next=tail
 ptr.next=None

solution3:
删除表内中间节点:

Y=ptr.next
 ptr.next=Y.next

Python代码:

def del_ptr(head,ptr):
    top=head
    if ptr.num==head.num:#删除链表头部的节点
        head=head.next
        print('已删除第%d号员工 姓名:%s 薪水:%d' %(ptr.num,ptr.name,ptr.salary))
    else:
        while top.next!=ptr:#找到删除节点的前一个位置
            top=top.next
        if ptr.next==None:#删除链表尾部的节点
            top.next=None
            print('已删除第%d号员工  姓名:%s 薪水:%d' %(ptr.num,ptr.name,ptr.salary))

        else:
            top.next=ptr.next #删除节点中任意节点
            print('已删除第%d号员工  姓名:%s 薪水:%d' %(ptr.num,ptr.name,ptr.salary))
    return head           #返回链表
            

在这里插入图片描述

单向链表的反转

反转过来输出单向链表:由于单向链表的节点知道下一个节点的位置,却无从得知上一个节点的位置(ps:双向链表可以)
如果要单向链表反转,必须使用3个指针变量:
以下代码有一点问题

def invert(head):#为链表的头指针
    ptr=head    #将ptr指向链表的开头
    before=None  #before是ptr的前一个节点
    last=findlast(head)
    while ptr!=None:
        last=before #将last接到before之后
        before=ptr #将before接到ptr之后
        ptr=ptr.next #将ptr移到下一个节点
        before.next=last #连接到之前的节点
    return before
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表中的节点按照顺序连接在一起,形成一个链式结构。 下面是Python单向链表的基本实现方式: 1. 定义节点类:首先定义一个节点类,包含两个属性:数据元素和指向下一个节点的指针。 ```python class Node: def __init__(self, data): self.data = data self.next = None ``` 2. 定义链表类:链表类包含若干个节点,以及对链表进行操作的方法。 ```python class LinkedList: def __init__(self): self.head = None def append(self, data): new_node = Node(data) if self.head is None: self.head = new_node else: current = self.head while current.next: current = current.next current.next = new_node def insert(self, data, position): new_node = Node(data) if position == 0: new_node.next = self.head self.head = new_node else: current = self.head for _ in range(position - 1): if current.next is None: raise IndexError("Index out of range") current = current.next new_node.next = current.next current.next = new_node def delete(self, position): if self.head is None: raise IndexError("Index out of range") if position == 0: self.head = self.head.next else: current = self.head for _ in range(position - 1): if current.next is None: raise IndexError("Index out of range") current = current.next if current.next is None: raise IndexError("Index out of range") current.next = current.next.next def get(self, position): if self.head is None: raise IndexError("Index out of range") current = self.head for _ in range(position): if current.next is None: raise IndexError("Index out of range") current = current.next return current.data def size(self): count = 0 current = self.head while current: count += 1 current = current.next return count ``` 以上是一个简单的Python单向链表实现,包括了向链表末尾添加节点、在指定位置插入节点、删除指定位置的节点、获取指定位置的节点值以及获取链表长度等基本操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值