在一行上:
先输入一个整数
代表链表中节点的总数;
随后输入一个整数
代表头节点的值;
随后输入
个二元组
;
最后输入一个整数
,代表需要删除的节点值。
除此之外,保证每一个
值在输入前已经存在于链表中;每一个
值在输入前均不存在于链表中。节点的值各不相同。
在一行上输出
个整数,代表删除指定元素后剩余的链表。
5 2 3 2 4 3 5 2 1 4 3
2 5 4 1
在这个样例中,链表的构造过程如下:
头节点为
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
随后,删除值为
的节点,得到链表
。
6 2 1 2 3 2 5 1 4 5 7 2 2
7 3 1 5 4
在这个样例中,链表的构造过程如下:
头节点为
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
在
后插入
,得到链表
;
随后,删除值为
的节点,得到链表
。
本题由牛客重构过题面,您可能想要阅读原始题面,我们一并附于此处。
【以下为原始题面】
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
构造过程,例如输入一行数据为: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->13 2表示为2->3链表为2->3->15 1表示为1->5链表为2->3->1->54 5表示为5->4链表为2->3->1->5->47 2表示为2->7链表为2->7->3->1->5->4最后的链表的顺序为 2 7 3 1 5 4最后一个参数为2,表示要删掉节点为2的值删除 结点 2
则结果为 7 3 1 5 4数据范围:链表长度满足,节点中的值满足
测试用例保证输入合法
import java.util.Scanner;
public class Main {
/**
* 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点
* 构造过程,例如
* 1 2(1插入2的后面)相当于尾插发
* 3 2(3插入2的后面)
* 5 1(5插入1的后面)
* 4 5
* 7 2
* 最后的链表的顺序为 2 7 3 1 5 4
* 删除 结点 2
* 则结果为 7 3 1 5 4
* 输入描述:
* 1 输入链表结点个数
* 2 输入头结点的值
* 3 按照格式插入各个结点
* 4 输入要删除的结点的值
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
int nodeNum = input.nextInt();//插入链表节点个数
MyNode head = null;
MyNode curr = null;
for (int i = 0; i < nodeNum; i++) {//循环插入nodeNum个节点
if (i == 0){
head = new MyNode(input.nextInt(),null);
curr = head;
}else {
curr = head;
int a = input.nextInt();
int b = input.nextInt();//a插到b后边
//找b,循环结束后还没有找到b,则直接插入最后
while(curr!=null){
if(curr.next == null){//如果找到最后一个也未发现,则直接加入到结尾
curr.next = new MyNode(a, null);
break;
}else if(curr.key == b){//找到b,且b不是最后一个节点
/*MyNode temp = new MyNode(a,null);
temp.next = curr.next;*/
curr.next = new MyNode(a, curr.next);
break;
}else {//未找到,后移一位
curr = curr.next;
}
}
}
}
int deleteNode = input.nextInt();//要删除的节点值
curr = head;//将curr初始化到头结点
boolean isExists = false;//是否存在要删除的节点
//如果删除的是头结点,则直接删除
if(head.key == deleteNode){
head = head.next;
isExists = true;
}else{//如果删除的不是头结点,则比较curr的next的key是否要删除
while(curr.next!=null){
if(curr.next.key==deleteNode){
curr.next = curr.next.next;//删除
isExists = true;
break;
}
curr = curr.next;
}
}
if(isExists){//如果删除了节点,初始化curr,遍历链表
curr = head;
while(curr!=null){
System.out.print(curr.key+" ");
curr = curr.next;
}
System.out.println();
}
}
}
static class MyNode {
int key;
MyNode next;
public MyNode(int key, MyNode next) {
this.key = key;
this.next = next;
}
}
}
#include <iostream>
using namespace std;
struct ListNode
{
int m_nKey;
ListNode * m_pNext;
ListNode(int key, ListNode *next = nullptr)
: m_nKey(key), m_pNext(next) {}
};
void insertNode(ListNode &head, int num1, int num2)
{
ListNode *p = &head;
while (p != nullptr && p->m_nKey != num2)
p = p->m_pNext;
if (p == nullptr)
return;
ListNode *newNode = new ListNode(num1, p->m_pNext);
p->m_pNext = newNode;
}
void deleteNode(ListNode &head, int num)
{
ListNode *p = &head;
while (p->m_pNext != nullptr && p->m_pNext->m_nKey != num)
p = p->m_pNext;
if (p->m_pNext == nullptr)
return;
ListNode *q = p->m_pNext;
p->m_pNext = q->m_pNext;
delete q;
}
void printList(ListNode &head)
{
ListNode *p = &head;
while (p != nullptr)
{
cout << p->m_nKey << " ";
p = p->m_pNext;
}
cout << endl;
}
int main()
{
int n, num1, num2;
while (cin >> n)
{
cin >> num1;
ListNode head(num1);
for (int i = 0; i < n - 1; ++i)
{
cin >> num1 >> num2;
insertNode(head, num1, num2);
}
cin >> num1;
deleteNode(head, num1);
printList(head);
}
return 0;
}
例程有错,输入格式是将每行第一个数插入到值为第二个数的节点后面
#include <iostream>
using namespace std;
struct ListNode
{
int data;
ListNode *next;
};
int main()
{
int num ,headvalue;
while(cin >> num >> headvalue)
{
ListNode *p,*head = new ListNode;
head->data = headvalue; //先输入第一个数
head->next = NULL;
int xin;
int jiu;
num--;
while(num--) //输入剩余的书
{
cin>>xin>>jiu;
ListNode *q = new ListNode;
q->data = xin;
for(p = head; p != NULL; p = p->next)
{
if(p->data == jiu)
{
q->next = p->next;
p->next = q;
}
}
}
int shanchu;
cin >> shanchu;
if(head->data == shanchu) //要删除的是第一个节点
{
head->next = NULL;
}
for(p = head; p->next != NULL; p = p->next)
{
if(p->next->data == shanchu)
p->next = p->next->next;
}
for(p = head; p != NULL; p = p->next)
{
cout << p->data <<" ";
}
cout << endl;
}
return 0;
}
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
// 注意输出最后有空格!
public class Main {
public static void main(String[] args) {
Scanner sca = new Scanner(System.in);
while(sca.hasNext()){
List<Integer> list = new LinkedList<>();
int count = sca.nextInt();
Integer head = sca.nextInt();
list.add(head);
for (int i = 0; i < count-1; i++) {
Integer src = sca.nextInt();
Integer temp = sca.nextInt();
if(list.contains(src)){
continue;
}
int weizhi = list.indexOf(temp);
if(weizhi==-1){
continue;
}
list.add(weizhi+1, src);
}
Integer delete = sca.nextInt();
list.remove(delete);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i)+" ");
}
// sb = sb.deleteCharAt(sb.length()-1);
System.out.println(sb.toString());
}
}
}
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
int main()
{
int n,first_value,x,y,delete_value;
while(cin>>n>>first_value)
{
list<int> l;
l.push_back(first_value);
for(int i=0;i<n-1;i++)
{
cin>>x>>y;
auto begin=l.begin();
auto end=l.end();
for(;begin!=end;begin++)
{
if(*begin==y)
{
l.insert(begin,x);
break;
}
}
}
cin>>delete_value;
l.remove(delete_value);
reverse(l.begin(),l.end());
for(auto i:l) cout<<i<<" ";
cout<<endl;
}
}
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 let [total,head,...arr] = readline().split(' ');
let remove = arr.pop(),link = [head];
while(arr.length){
let [tail,head,...rest] = arr;
arr = rest;
let index = link.indexOf(head);
link.splice(index+1,0,tail);
}
let i = link.indexOf(remove);
link.splice(i,1);
console.log(link.join(' '))
#include <stdio.h>
#include <stdlib.h>
typedef struct list
{
int num;
struct list *next;
}list;
int main()
{
int cnt,del,i,j;
list *p0=malloc(sizeof(list)),*p1,*p2;
scanf("%d%d",&cnt,&p0->num);
p0->next=NULL;
cnt--;
while(cnt>0)
{
scanf("%d%d",&i,&j);
p1=p0;
while(p1!=NULL)
{
if(p1->num==j)
{
p2=malloc(sizeof(list));
p2->num=i;
p2->next=p1->next;
p1->next=p2;
break;
}
p1=p1->next;
}
cnt--;
}
scanf("%d",&del);
p1=p0;
p2=p0->next;
if(p1->num==del)
p0=p0->next;
else
{
while(p2!=NULL)
{
if(p2->num==del)
{
p1->next=p2->next;
break;
}
p1=p2;
p2=p2->next;
}
}
p1=p0;
while(p1!=NULL)
{
printf("%d ",p1->num);
p1=p1->next;
}
return 0;
} import java.util.*;
public class Main{
static class Node{
int val;
Node next;
Node(int val){
this.val=val;
this.next=null;
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int m=scanner.nextInt();
Node head=new Node(m);
HashMap<Integer,Node> map=new HashMap<>();
map.put(m,head);
for (int i = 0; i < n-1; i++) {
int item1=scanner.nextInt();
int item2=scanner.nextInt();
Node node=map.get(item2);
Node newnode=new Node(item1);
map.put(item1,newnode);
if(node.next==null){
node.next=newnode;
}else {
Node item=node.next;
node.next=newnode;
newnode.next=item;
}
}
int target=scanner.nextInt();
while (head!=null){
if(head.val!=target){
System.out.print(head.val+" ");
}
head=head.next;
}
}
} inpt = list(map(int, input().split()))
node_num = inpt[0]
head_value = inpt[1]
del_value = inpt[-1]
res = [head_value]
for i in range(2, node_num * 2, 2):
if inpt[i] not in res:
res.insert(res.index(inpt[i+1])+1, inpt[i])
else:
res.insert(res.index(inpt[i])-1, inpt[i+1])
res.remove(del_value)
for j in res:
print(j,end=' ')
//java已经封装了链表,使用LinkedList操作即可,增删效率高
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
// 5 2, 3 2 4 3 5 ,2 , 1 4, 3
String inputStr = sc.nextLine();
String[] strs = inputStr.split(" ");
String head = strs[1];// 2
String remove = strs[strs.length - 1];//3
List<String> list = new LinkedList();
list.add(head);// 2
for (int i = 2; i <= strs.length - 3; i = i+2) { //4次 3 2,4 3,5 2 ,1 4 每两数一组
String current = strs[i+1];// 2
String next = strs[i];// 3
list.add(list.indexOf(current) + 1,next);
}
list.remove(list.indexOf(remove));// 删除 3
System.out.println(String.join(" ",list));
}
}
} #include
int main()
{
//Input number of points & value of first number
int num;
int fir;
scanf("%d %d",&num,&fir);
int sum[1000]={0};
sum[0]=fir;
//Input two numbers per time
int i=1;
while(i<num)//Times of while loop
{
int n1=0,n2=0;
scanf("%d %d",&n1,&n2);
//Detect points and input new points
for(int j=0; j<num; j++)
{
if(sum[j]==n2)
{
//Detect whether there is a value
if(sum[j+1]==0)
{
sum[j+1]=n1;//If not, input new points
}
else
{
for(int k=i; k>j+1; k--)
{
sum[k]=sum[k-1];//If there is, move all point back for one place
}
sum[j+1]=n1;
}
}
}
i++;
}
//Delete value of late number in string
int del;
scanf("%d", &del);
for(int i=0; i<num; i++)
{
if(sum[i]==del)
{
for(int j=i; j<num; j++)
{
sum[j]=sum[j+1];//If there is a deleted point, all points behind it should move toward for one place
}
num--;//And number of string should minus one
}
}
//Output the final string
for(int i=0; i<num; i++)
{
printf("%d ",sum[i]);
}
}
while True: try: s=input().split() n=int(s[0]) head=int(s[1]) t=int(s[len(s)-1]) s=[int(s[i]) for i in range(2,len(s)-1)] m=[] for i in range(0,len(s),2): tmp = s[i:i+2] m.append(tmp) def insert(l,x,y): if y in l: l.insert(l.index(y),x) l=[head] for i in m: insert(l, i[0], i[1]) l.remove(t) l=l[::-1] for i in l: print(i,end=' ') print() except: break
#travel def travel_dict(list): key_value=list.get(-1); str_re=''; while key_value!=None: str_re=str_re+"%d "%key_value; key_value=list.get(key_value); print(str_re.strip()) #insert def insert_dict(list,re_num): value_num=list[re_num]; list.pop(re_num); for k in list: if list[k]==re_num: list[k]=value_num; return list; if __name__=="__main__": str=input(); list_o=str.split(); num=int(list_o[0]); re_num=int(list_o[-1]); #create dict list_dict=dict(); list_dict[-1]=int(list_o[1]) for n in range(1,num): e=[int(list_o[n*2+1]),int(list_o[n*2])]; cell_num=list_dict.get(e[0]); if cell_num==None: list_dict[e[0]]=e[1]; else: list_dict.pop(e[0]); list_dict[e[0]]=e[1]; list_dict[e[1]]=cell_num; list_dict=insert_dict(list_dict,re_num); travel_dict(list_dict);
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
/**
* @author Yuliang.Lee
* @version 1.0
* @date 2021/9/28 18:14
* 单向链表删除指定值的结点:
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
(链表的值不会重复,且测试用例保证输入合法)
* 示例1:
输入:6 2 1 2 3 2 5 1 4 5 7 2 2
输出:7 3 1 5 4
描述:输入表示有6个节点,首节点的值为2,然后(1,2)表示在值为2的节点后添加值为1的元素,即得到2 -> 1;(3,2)即在2后添加3,得到2 -> 3 -> 1;
(5,1)即在1的后面添加5,得到2 -> 3 -> 1 -> 5;(4,5)得到2 -> 3 -> 1 -> 5 -> 4;(7,2)得到2 -> 7 -> 3 -> 1 -> 5 -> 4
最终的链表为:2 -> 7 -> 3 -> 1 -> 5 -> 4,需要删除的是值为2的节点,
所以结果应为:7 -> 3 -> 1 -> 5 -> 4
* 示例2:
输入:5 2 3 2 4 3 5 2 1 4 3
输出:2 5 4 1
* 示例3:
输入:1 5 5
输出:null
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int n = in.nextInt();
// 定义链表,增删操作频繁的情况,使用LinkedList效率比较高
List<Integer> chain = new LinkedList<>();
// 初始化链表
chain.add(in.nextInt());
for (int i = 0; i < n - 1; i++) {
int readyNode = in.nextInt();
int existNode = in.nextInt();
chain.add(chain.indexOf(existNode) + 1, readyNode);
}
// 删除指定值,注意这里与chain.remove(in.nextInt())的区别
chain.remove(new Integer(in.nextInt()));
// 输出
if (chain.size() == 0) {
System.out.println("null");
} else {
for (int i = 0; i < chain.size(); i++) {
System.out.print(chain.get(i) + (i == chain.size() - 1 ? "\n" : " ")); // 最后三目运算符这里必须加括号,并且返回的不能是字符必须是字符串
}
}
}
}
}
#include <stdio.h>
#include <string.h>
typedef struct node
{
int _data;
struct node* _next;
}Node;
//创建头结点
Node* creatHeadNode(int data)
{
Node* head = (Node*)malloc(sizeof(Node));
head->_data = data;
head->_next = NULL;
return head;
}
//插入节点
Node* insertNode(Node* head, int data, Node* tmp)
{
Node* cur = (Node*)malloc(sizeof(Node));
cur->_data = data;
cur->_next = tmp->_next;
tmp->_next = cur;
return head;
}
//删除节点
Node* deletNode(Node* head, int data)
{
Node* tmp;
if(head->_data == data)
{
tmp = head->_next;
free(head);
return tmp;
}
else
{
tmp = head;
while(tmp->_next->_data != data)
tmp = tmp->_next;
Node* cur = tmp->_next;
tmp->_next = cur->_next;
free(cur);
return head;
}
}
//查找
Node* searchNode(Node* head, int find)
{
Node* tmp = head;
while(tmp->_data != find)
tmp = tmp->_next;
return tmp;
}
int main()
{
int arr[2000];
int n;
scanf("%d", &n);
arr[0] = n;
int len = (n-1)*2+3;
for(int i=1;i<len; i++)
scanf("%d", &(arr[i]));
Node* head = creatHeadNode(arr[1]);
for(int i=2; i<len-1; i+=2)
{
Node* cur = searchNode(head, arr[i+1]);
insertNode(head, arr[i], cur);
}
deletNode(head, arr[len-1]);
int th = (len-3)/2;
Node* tmp = head;
for(int i=0; i<th; i++)
{
printf("%d ", tmp->_data);
tmp = tmp->_next;
}
return 0;
} import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // 结点数
int head = in.nextInt(); // 头节点
ArrayList<Integer> list = new ArrayList();
list.add(head);
while(--n > 0){
int next = in.nextInt(); // 待插入的结点
int pre = in.nextInt(); // 目标结点,需要在目标结点后插入next
if(list.indexOf(pre) < 0){ // -1表示没有这个值,直接在链表的最后插入next
list.add(next);
}else{ // 找到pre结点,在pre的***入next
list.add(list.indexOf(pre)+1,next);
}
}
int targe = in.nextInt();
list.remove((Integer)(targe)); // 删除
for(Integer it : list){
System.out.print(it+" ");
}
}
} import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int n = in.nextInt();
Integer[] ints = new Integer[n * 2];
for (int i = 0; i < n * 2; i++) {
ints[i] = in.nextInt();
}
LinkedList<Integer> list = new LinkedList<>();
//头节点
list.add(ints[0]);
//依次插入
for (int i = 1; i < ints.length - 1; i += 2) {
list.add(list.indexOf(ints[i + 1]) + 1, ints[i]);
}
//删除最后出现的
list.remove(ints[ints.length - 1]);
for (Integer i : list) {
System.out.print(i + " ");
}
System.out.println();
}
}
} public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int num = in.nextInt();
ListNode head = new ListNode(in.nextInt());
for(int i = 0;i < num - 1;i++){
ListNode newNode = new ListNode(in.nextInt());
int curVal = in.nextInt();
ListNode node = head;
while(node != null){//找待插入节点的前一个节点
if(node.val == curVal){
break;
}else{
node = node.next;
}
}
if(node.next == null){//尾节点插入
node.next = newNode;
}else{//中间插入
ListNode nex = node.next;
node.next = newNode;
newNode.next = nex;
}
}
int removeVal = in.nextInt();
//注意删除头节点
ListNode preHead = new ListNode();
preHead.next = head;
ListNode cur = preHead;
while(cur != null){
if(cur.next.val == removeVal){
cur.next = cur.next.next;
break;
}
cur = cur.next;
}
//输出
ListNode curHead = preHead.next;
while(curHead != null){
System.out.print(curHead.val + " ");
curHead = curHead.next;
}
System.out.println();
}
}
}
class ListNode{
int val;
ListNode next;
public ListNode(int val,ListNode next){
this.val = val;
this.next = next;
}
public ListNode(int val){
this.val = val;
}
public ListNode(){
}