首页 > 试题广场 >

从单向链表中删除指定值的节点

[编程题]从单向链表中删除指定值的节点
  • 热度指数:131850 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。

链表的值不能重复。

构造过程,例如输入一行数据为:
6 2 1 2 3 2 5 1 4 5 7 2 2
则第一个参数6表示输入总共6个节点,第二个参数2表示头节点值为2,剩下的2个一组表示第2个节点值后面插入第1个节点值,为以下表示:
1 2 表示为
2->1
链表为2->1

3 2表示为
2->3
链表为2->3->1

5 1表示为
1->5
链表为2->3->1->5

4 5表示为
5->4
链表为2->3->1->5->4

7 2表示为
2->7
链表为2->7->3->1->5->4

最后的链表的顺序为 2 7 3 1 5 4

最后一个参数为2,表示要删掉节点为2的值

删除 结点 2

则结果为 7 3 1 5 4

数据范围:链表长度满足 ,节点中的值满足

测试用例保证输入合法



输入描述:
输入一行,有以下4个部分:

1 输入链表结点个数
2 输入头结点的值
3 按照格式插入各个结点
4 输入要删除的结点的值



输出描述:
输出一行

输出删除结点后的序列,每个数后都要加空格

示例1

输入

5 2 3 2 4 3 5 2 1 4 3

输出

2 5 4 1

说明

形成的链表为2->5->3->4->1
删掉节点3,返回的就是2->5->4->1  
示例2

输入

6 2 1 2 3 2 5 1 4 5 7 2 2

输出

7 3 1 5 4

说明

如题  
class LN:
    def __init__(self,val = 0,next = None):
        self.val = val
        self.next = next

def inval(head,m:int,n:int):
    p = head
    while p:
        if p.val == m:
            break
        else:
            p = p.next
    temp = p.next
    p.next = LN(n,temp)

    return head
def delval(head,val):
    if head.val == val:
        return head.next
    p = head
    while p:
        pre = p
        p = p.next
        if p.val == val:
            pre.next = p.next
            return head
try:
    a = list(map(int, input().split(' ')))

    head = LN(a[1])
    i = 2
    while i < len(a) - 1:
        head = inval(head,a[i+1],a[i])
        i += 2

    head = delval(head,a[-1])

    while head:
        print(head.val,end= ' ')
        head = head.next
except:
    pass
发表于 2024-07-10 23:33:10 回复(0)
class ListNode:
    def __init__(self, val, next = None):
        self.val = val
        self.next = next
class Solution:
    def insert(self, head, val_pre, val):
        cur = head
        while cur.val != val_pre:
            cur = cur.next
        next_node = cur.next
        node = ListNode(val)
        cur.next = node
        node.next = next_node
    
    def remove(self, head, val):
        cur, pre = head, head
        while cur.val != val:
            pre = cur
            cur = cur.next
        pre.next = cur.next

input = list(map(int, input().split()))
head = ListNode(input[1])
solution = Solution()
for i in range(2, len(input) - 1, 2):
    solution.insert(head, input[i+1], input[i])
solution.remove(head, input[-1])
while head:
    print(head.val, end = ' ')
    head = head.next

发表于 2023-12-27 23:24:49 回复(0)

求大佬帮忙看看,为啥超时了

import re
import sys

input_list = input().split()
n = int(input_list[0]) # 链表结点个数
first_value = input_list[1] # 头结点的值
values = input_list[2:(2*n)] # 节点规则list
x = input_list[-1] # 要删除的结点的值

LIST = [first_value] # 链表list


while len(LIST)<n: # 当链表节点个数达到时,跳出循环
    tmp = values.copy() # 复制一个节点规则list,防止后面循环里删除时产生矛盾
    length = len(tmp) 
    last_value = LIST[-1] 
    # 从未完成的链表的最后一个节点开始,找其后面的值
    # 需要倒序看节点规则list,比如头节点的值在节点规则里面出现三次,即头节点后面依次加入了3个节点,并且是倒叙加入
    # 节点规则list里,偶数i对应i-1,i是定位需要添加后一个值的节点,i-1是添加的节点值
    for i in range(length-1,-1,-2): 
        if tmp[i] == last_value:
            LIST.append(tmp[i-1])
            del values[i] # 为了减少遍历的长度,已经添加过的节点,在节点规则list里删除
            del values[i-1] # 为了减少遍历的长度,已经添加过的节点值,在节点规则list里删除

result = ''
for v in LIST:
    if v != x:
        result += str(v)
        result += ' ' 
print(result)
发表于 2023-11-29 17:58:36 回复(0)
# 定义链表结构
class ListNode:
    def __init__(self,val,next=None):
        self.val = val
        self.next = next

def addNode(old,new):
    newNode = ListNode(new)
    newNode.next = old.next
    old.next = newNode

# 构建初始链表
inList = [int(i) for i in input().split()]
n = inList[0]
k = inList[-1]

dummy =ListNode(None)
root = ListNode(inList[1])
dummy.next = root

#构建完整链表
for i in range(2,len(inList)-2,2):
    old = inList[i+1]
    new = inList[i]
    while root.val != old:
        root = root.next
    addNode(root,new)
    root = dummy.next

#删除指定结点
if root.val == k:
    root = root.next
else:
    for _ in range(n):
        if root.next.val == k:
            root.next = root.next.next
            break
        root = root.next

#打印删除后链表
out = []
for _ in range(n-1):
    out.append(dummy.next.val)
    dummy = dummy.next

for i in range(len(out)):
    print(out[i], end=' ')
  

发表于 2023-07-25 04:34:13 回复(0)
class ListNode:
    def __init__(self, val):
        self.val = val
        self.next = None
# 根据题意在链表中插入节点        
def create_list(head_node, val1, val2):
    cur=head_node
    while cur:
        if cur.val==val2:
            insert_node=ListNode(val1)
            insert_node.next=cur.next
            cur.next=insert_node
            break
        else:
            cur=cur.next

S=[int(x) for x in input().split()]
head_value=S[1] #头结点值
N=S[2:-1] #链表的操作
value=S[-1] #要删除的节点的值

head=ListNode(head_value)
# 按照题目格式插入各个节点
for i in range(0,len(N),2):
    create_list(head,N[i],N[i+1])
# 删除指定值的结点
cur=head
while cur:
    if cur.next.val==value:
        cur.next=cur.next.next
        break
    else:
        cur=cur.next

# 打印删除后的列表
cur=head
while cur:
    print(cur.val,end=' ')
    cur=cur.next
# 若删除后列表无结点 返回None
if S[0]==1 and S[-1]==S[1]:
    print(None)


发表于 2023-02-11 22:19:00 回复(0)
从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
--题目中,“空指针”的情况并不会出现吧
发表于 2022-12-24 19:14:52 回复(0)
while True:
    try:
        str1 = input().split()
        res = []
        tatle = str1[0]
        res.append(str1[1])
        for i in range(2,int(tatle)*2, 2):
            res.insert(res.index(str1[i+1])+1, str1[i])
        res.remove(str1[-1])
        print(' '.join(res)) 
    except:
        break
发表于 2022-08-13 14:03:16 回复(0)
while True:
    try:
        list1 = list(map(int, input().split()))
        res = []
        n = len(list1)
        res.append(list1[1]) #将头结点值加入列表
        #for循环步长2
        for i in range(2, n-1, 2):
            index1 = res.index(list1[i + 1])
            #list的insert函数可以完美的插入结点,只不过是头插法
            res.insert(index1, list1[i])
        res.remove(list1[-1])
        #翻转列表即可
        res.reverse()
        print(*res)
    except:
        break
发表于 2022-07-19 10:29:44 回复(0)
python3
class ListNode:
    def __init__(self, val):
        self.val = val
        self.next = None

while True:
    try:
        numbers = list(map(int, input().split()))
        count, start_value, del_value = numbers[0], numbers[1], numbers[-1]
        table = numbers[2:-1]
        length_table = len(table)
        start_node = ListNode(start_value)
        for i in range(0,length_table,2):
            next_value = table[i]
            next_node = ListNode(next_value)
            cur_value = table[i+1]
            head = start_node
            while head.val != cur_value:
                head = head.next
            if head.next:
                next_node.next = head.next
                head.next = next_node
            else:
                head.next = next_node
        
        head = start_node        
        output = []
        while head:
            if head.val != del_value:
                output.append(str(head.val))
            head = head.next
        output = " ".join(output)
        print(output)
    except:
        break


发表于 2022-07-18 11:39:59 回复(0)
我有个不太明白的点:就是每两个一组都是一定要和原来的链表连上吗?
比如:5 2 3 2 1 4 4 3 5 2 3  (3 2 1 4 4 3 5 2)这种的构造可以吗?


发表于 2022-07-08 15:29:29 回复(0)
简单,但是我调试了一个小时😭
s = list(map(int, input().split()))
a = s[-1]
a2 = s[2:-1]
res = [s[1]]
for i in range(0,len(a2),2):    
    j = i+1
    ii = res.index(a2[j])
    res.insert(ii+1,a2[i])
res.remove(a)  
for i in res:
    print(i,end=" ")

发表于 2022-06-22 22:12:46 回复(0)
data = list(map(int, input().split()))
link=[data[1]]
for i in range(1,data[0]):
    if link.count(data[2*i])==0:
        link.insert(link.index(data[2*i+1])+1, data[2*i])
link.remove(data[-1])
for i in link:
    print(i,end=' ')

发表于 2022-06-20 20:29:33 回复(0)
链表的增删改查:
class node:
    def __init__(self, data):
        self.data = data
        self.nextNode = None


class lineTest:
    def __init__(self, fNode):
        self.fNode = fNode

    def insertNode(self, data1, data2):
        xNode = self.findNode(self.fNode, data2)
        newNode = node(data1)
        newNode.nextNode = xNode.nextNode
        xNode.nextNode = newNode

    def findNode(self, sNode, data):
        if sNode.data == data:
            return sNode
        else:
            return self.findNode(sNode.nextNode, data)

    def printLine(self, sNode, listC, rData):
        if sNode is None:
            return
        else:
            if sNode.data == rData:
                pass
            else:
                listC.append(sNode.data)
            self.printLine(sNode.nextNode, listC, rData)


if __name__ == "__main__":
    a = input()
    listA = a.strip().split(" ")
    listB = []
    for i in listA:
        listB.append(int(i))
    nodeList = listB[2:len(listB) - 1]
    
    # 创建初始节点,并且创建链表类
    nNode = node(listB[1])
    lineClass = lineTest(nNode)

    # 链表类加入节点
    i = 0
    while i < len(nodeList):
        lineClass.insertNode(nodeList[i], nodeList[i + 1])
        i += 2
    
    listC = []
    lineClass.printLine(nNode, listC, listB[-1])
    resStr = ""
    for i in listC:
        resStr = resStr + " " + str(i)
    print(resStr.strip())


发表于 2022-06-05 16:14:39 回复(0)
while True:
    try:
        s = input().split()
        s_num, s_top, ss, s_d = s[0], s[1], s[2:-1], s[-1]
        print( s_num, s_top, ss, s_d )

        ssr = [s_top]
        for x in range(0, len(ss), 2):
            x1, x2 = ss[x], ss[x+1]
            ssr.insert(ssr.index(x2) + 1, x1)

        ssr.remove(s_d)
        print(' '.join( ssr ))

    except:
        break

发表于 2022-06-01 21:31:29 回复(0)
class Node(object):
    def __init__(self,val=0):
        self.val = val
        self.next = None

def insert(head,tag,in_val):
    cur = head
    while cur.val != tag:
        cur = cur.next
    node = Node(in_val)
    node.next = cur.next
    cur.next = node
    


while True:
    try:
        s = list(map(int,input().split()))
        size = s[0]
        head = Node(s[1])
        val_list = s[2:len(s)-1]
        k = s[-1]
        for v in range(0,len(val_list),2):
            insert(head, val_list[v + 1], val_list[v])
            
        val_list = []
        cur = head
        while cur:
            val_list.append(cur.val)
            cur = cur.next
        val_list.remove(k)
        print(' '.join([str(i) for i in val_list]))
        
    except EOFError:
        break
发表于 2022-05-28 22:48:05 回复(0)
#  按照逻辑去获取列表,对链表source_list进行为2的跳跃遍历
#  两两成组,后面的数是前面的数的前驱节点,所以把后面的数称为前驱节点
#  前面的数叫cur,要插入的元素,index置是前驱节点的索引+1
while True:
    try:
        source_list = input().split()
        ls = [source_list[1]]  #获取头结点,放到ls
        
        for idx in range(2, len(source_list[2:]), 2): # 两两成组
            cur, ance = source_list[idx], source_list[idx+1]
            index = ls.index(ance) + 1
            ls.insert( index , cur )  # 插入cur,index位置是ance的索引+1
            
        ls.remove(source_list[-1])    # 移除最后不需要的结点
        print(' '.join(ls))
    except:
        break

发表于 2022-05-13 13:49:39 回复(0)