首页 > 试题广场 >

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

[编程题]从单向链表中删除指定值的节点
  • 热度指数:131929 时间限制: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

说明

如题  
纠结了半天怎么不对。。看来看去没道理啊。。点开对比一看数据太长了得加个end=" "
while True:
    try:
        str1=input().split() #空格区分
        n = str1[0] #提取个数
        start= str1[1]#提取初始
        dele = str1[-1]#提取删除项
        del str1[0]
        del str1[0]
        del str1[-1]#删除无用项
        a=[start] #键入初始项
        i=0
        while i < (len(str1)-1): 
            if str1[i+1] in a:#开始连接,每第i+1项为节点值,i项为插入值
                index = a.index(str1[i+1])#查找其位置
                a.insert(index+1, str1[i])#插入
            i=i+2
        if dele in a:#当存在时,删除
            index = a.index(dele)
            del a[index]
        str2=' '.join(a)
        print(str2,end=" ")#记得打end = " " 此数据过长会省略
    except:
        break



发表于 2021-06-29 14:13:45 回复(0)
templist = input().split(' ')
numNodes = int(templist[0])
myls = [templist[1]]

for i in range(numNodes-1):
    target, insert = templist[2+2*i], templist[3+2*i]
    myls.insert(myls.index(insert)+1, target)

myls.remove(templist[-1])

for item in myls:
    print(item, end=' ')

注意输出格式
发表于 2021-05-07 11:14:16 回复(0)
"""
[说明]:
    1,本题的输入格式有问题,实际输入格式是将各元素在一行进行输入!!!
        比如例子中的输入格式为:5 2 3 2 4 3 5 2 1 4 3
    2,每组例子输出完成(在每个字符后都要加空格)后,还需要加上单独的一个换行!!!

    3,题目中的->符号表示按照顺序插入
        例如,2->1,2->3,2->7,表示先 2->1,然后 2->3->1,最后 2->7->3->1
    
    4,其他的就和常规链表删除结点操作一样了,下面用数组进行处理。
"""
class Solution:
    def fun(self, head, target, arr):
        # 用来存储整个链表的最终表示(未删除前),例如,2->5->3->4->1
        ans = [head]
        for num in arr:
            idx = ans.index(num[1])   # 找到当前结点在ans中的位置
            ans.insert(idx+1, num[0])  # 再将当前结点的下一个结点插入到ans中的下一个位置
        # 找到要删除结点的位置
        tmp = ans.index(target)
        # 删除目标结点
        ans.pop(tmp)
        return ans
    
if __name__ == '__main__':
    while True:
        try:
            # 题目中的输入是将所以元素在同一行输入,同时中间用空格
            tmp = list(map(int, input().split()))
            # 结点总个数
            n = tmp[0]
            # 头结点
            head = tmp[1]
            # 需要删除的目标结点
            target = tmp[-1]
            # 将各结点的链接重新处理一下,例如,arr = [[3,2], [4,3], [5,2], [1, 4]]
            tmp = tmp[2:len(tmp)-1]
            arr = []
            for i in range(len(tmp)//2):
                arr.append([tmp[2*i], tmp[2*i+1]])
            ans = Solution().fun(head, target, arr)
            for i in range(len(ans)):
                print(str(ans[i]), end=' ')
            # 在每一个例子输出完后,还要加上一个换行!!!
            print()
        except:
            break

编辑于 2021-01-17 20:57:37 回复(0)
又是一道很恶心的题目,实际的输入格式和题目中说的不一样
while True:
    try:
        nums = list(map(int, input().split()))
        nodes = [nums[1]]
        for i in range(1, nums[0]):
            v, pre = nums[2*i:2*i+2]
            nodes.insert(nodes.index(pre)+1, v)
        k = nums[-1]
        nodes.remove(k)
        print(" ".join(list(map(str, nodes)))+" ")
    except:
        break


发表于 2020-12-16 20:40:53 回复(0)
题目**较多:
坑1:用例输入全部在一个字符串中,而示例是换行输入
坑2:最后输出结果要加上一个空格
解法,题目中的链表是单向链表,此处使用回环链表便于使用和理解,语言python 2.9.3
#coding:utf-8
class IntNode(object):
    def __init__(self,i, n, p):
        self.item = i
        self.next = n
        self.prev = p

class SLList(object):
    def __init__(self,x=None):
        self.sentinel = IntNode('sentinel',None,None)
        self.sentinel.next = self.sentinel
        self.sentinel.prev = self.sentinel
        new_node = IntNode(x,self.sentinel, self.sentinel)
        self.sentinel.next = new_node
        self.sentinel.prev = new_node

    def get_node(self,x):
        node = self.sentinel
        while node.item != x:
            node = node.next
        return node

    def insert_node(self,x,node_item):
        '''在node***入新节点'''
        node = self.get_node(node_item)
        new_node = IntNode(x, node.next, node)
        node.next.prev = new_node
        node.next = new_node

    def remove_node(self,x):
        node = self.get_node(x)
        node.prev.next = node.next
        node.next.prev = node.prev

    def get_item_list(self):
        node = self.sentinel.next
        item_list = []
        while node.item != 'sentinel':
            item_list.append(str(node.item))
            node = node.next
        return item_list

while True:
    try:
        data = map(int, raw_input().strip().split())
        n = data[0]
        first = data[1]
        l = SLList(first)
        for i in range(n-1):
            item = data[2+i*2]
            node = data[3+i*2]
            l.insert_node(item, node)
        remove = data[-1]
        l.remove_node(remove)
        print ' '.join(l.get_item_list()) + ' '
    except:
        break

发表于 2020-12-06 09:24:22 回复(0)
while 1:
    try:
        n = input()
        head = input()
        num = [head]
        for i in range(int(n)-1):
            a, b = input().split()
            num.insert(num.index(b)+1, a)
        del_num = input()
        num.remove(del_num)
        print(' '.join(num))
    except:
        break
这个为啥不行?没输出是什么鬼

发表于 2020-08-06 00:18:32 回复(0)
这道题目,首先输入格式不是题目给出的那样按组输入数据,而是全部一次性输入中间带空格;另外输出格式采用join函数,最后要带一个空格,也就是输出的每个元素后面都要带空格,这个题目描述的准确,因此join一个列表最后加一个空格即可
while True:
    try:
        s = input().split(' ')
        ls = []
        ls.append(s[1])
        m = 2
        for i in range(eval(s[0])-1):
            a,b = s[m],s[m+1]
            for j in range(len(ls)):
                if a == ls[j]:
                    ls.insert(j+1,b)
                    break
                if b == ls[j]:
                    ls.insert(j,a)
                    break
            m += 2
        ls.remove(s[-1])
        ls.reverse()
        print(' '.join(ls)+' ')
    except:
        break

发表于 2020-05-20 21:26:43 回复(5)
while 1:
    try:
        inputlist = input().split()
        N, head, mylist = inputlist[0], inputlist[1], inputlist[2:]
        newlist = []
        newlist.append(head)
        i = 0
        while i<=len(mylist)-3:
            m,n = mylist[i], mylist[i+1]
            newlist.insert(newlist.index(n)+1,m)
            i += 2
        if mylist[-1] in newlist:
            newlist.remove(mylist[-1])
            mylist.index()
        else:
            pass
        print(' '.join(newlist))

    except:
        break

................................
发表于 2020-05-04 17:50:11 回复(0)
class Node(object):
    def __init__(self,elem):
        self.elem = elem
        self.next = None

class SingleLinkList(object):
    def __init__(self,node=None):
        self._head = node

    def length(self):
        cur = self._head
        count = 0
        while cur:
            cur = cur.next
            count += 1
        return count

    def travel(self):
        cur = self._head
        while cur:
            print(cur.elem, end = " ")
            cur = cur.next
        print("")

    def add(self,item):
        node = Node(item)
        node.next = self._head
        self._head = node

    def insert(self,item,index):
        node = Node(item)
        if not self._head:
            self._head = node
        else:
            cur = self._head
            count = 0
            while cur:
                if cur.elem == index:
                    node.next = cur.next
                    cur.next = node
                    break
                else:
                    cur = cur.next

    def remove(self,item):
        node = Node(item)
        cur = self._head
        pre = None
        while cur:
            if cur.elem == item:
                if cur == self._head:
                    self._head = cur.next
                else:
                    pre.next = cur.next
                break
            else:
                pre = cur
                cur = cur.next
while True:
    try:
        ll = SingleLinkList()
        a = list(map(int,input().split()))
        n = a[0]
        ll.add(a[1])
        for i in range(n-1):
            c = a[2+i*2]
            d = a[3+i*2]
            ll.insert(c,d)
        ll.remove(a[-1])
        ll.travel()
    except:
        break

发表于 2020-02-29 21:00:37 回复(6)
/*只能说bug有点多,输出最后还要加空格,题目也没有说清楚,佛了佛了……*/
def result(head,arr,rem):
    res = []
    res.append(head)
    for item in arr:
        index = res.index(item[1])
        res.insert(index+1,item[0])
    res.remove(rem)
    return res

while True:
    try:
        temp = list(map(int,input().split()))
        n = temp[0]
        head = temp[1]
        rem = temp[-1]
        arr = []
        for i in range(2,len(temp)-1,2):
            arr.append([temp[i],temp[i+1]])
        ss = result(head,arr,rem)
        res = list(map(str, ss))
        print(" ".join(res)+' ')
    except:
        break

发表于 2018-08-29 19:41:59 回复(0)
try:
    while 1:
        a = []
        s = raw_input().split()
        Node = int(s[0])
        a.append(int(s[1]))
        k = 2
        for i in xrange(Node - 1):
            m, n = int(s[k]), int(s[k + 1])
            a.insert(a.index(n) + 1, m)
            k += 2
        a.remove(int(s[-1]))
        for i in a[:-1]:
            print i,
        print a[-1],
        print ''
except:
    pass

发表于 2017-01-26 16:15:51 回复(0)
def solution(lst, val):
    if val in lst:
        lst.remove(val)
        return lst
    return None

import sys
try:
    while 1:
        inp = sys.stdin.readline().strip('\n') # 输入只有一行,空格分隔
        if not inp:
            break
        nums = map(int, inp.split())
        # print 'n',nums[0],'head', nums[1], 'del_val', nums[-1]
        lst = [nums[1]]
        i = 2
        while i < nums[0]*2:
            target = nums[i+1]
            idx = lst.index(target)
            lst.insert(idx+1, nums[i])
            i += 2
        
        ret = solution(lst, nums[-1])
        # print ret
        for i in ret[:-1]:
            print i,
        print ret[-1],
        print ''

        
except:
    pass
格式描述太有问题了。print了好多,终于神奇的过了。。

发表于 2016-09-09 14:40:18 回复(0)