【NewCoder】AB9 链表

题目简述

(题源牛客网)

描述

请你实现一个链表。
操作:
insert x y:将y加入链表,插入在第一个值为x的结点之前。若链表中不存在值为x的结点,则插入在链表末尾。保证x,y为int型整数。
delete x:删除链表中第一个值为x的结点。若不存在值为x的结点,则不删除。

输入描述:

第一行输入一个整数 n n n ( 1 ≤ n ≤ 1 0 4 1≤n≤10^4 1n104) ,表示操作次数。
接下来的n行,每行一个字符串,表示一个操作。保证操作是题目描述中的一种。

输出描述:

输出一行,将链表中所有结点的值按顺序输出。若链表为空,输出"NULL"(不含引号)。
示例1

输入:5
	  insert 0 1
	  insert 0 3
	  insert 1 2
	  insert 3 4
	  delete 4
输出:2 1 3

思路

本题要求实现基本链表结构。由于限定为整数,则链表节点结构只需设定为存储一个整型数据即可。

insert操作中,可通过新设立一个指针p1来追踪当前链表节点状态,如果链表中无元素则直接插入节点,如果有元素,则判断是否与insert函数中的参数x相等,如果满足则直接插入,如果没有符合条件的节点(遍历整个当前状态列表)就插入末尾。

delete操作同理,通过新的指针p1追踪整个链表并遍历,如果有满足条件的点,直接进行基本的链表删除操作(记录待删除节点前的点->修改删除节点前的点指针域->删除待删节点),若没有则不进行任何操作。

具体注释可见代码

#include 
#include 
using namespace std;

// 链表结构定义
struct node{
    int data;
    node* next = nullptr;
};

// 本题目链表定义(p为头结点但非首元结点)
node* p = new node;

// 插入函数
void insert_node(int x, int y){
    node* p1 = p;
    // 链表无任何元素
    if (p1 -> next == nullptr){
    	// 直接插入新节点
        node *p2 = new node;
        p2 -> data = y;
        p2 -> next = nullptr;
        p1 -> next = p2;
        return;
    }
    // 链表有元素
    else{
        while(p1){      
        	// 找到了待插入位置
            if(p1 -> next != nullptr && p1 -> next -> data == x){
                node* p2 = new node;
                p2 -> data = y;
                p2 -> next = p1 -> next;
                p1 -> next = p2;
                return;
            }
            // 若已到达末尾则直接插到末位
            else if(p1 -> next == nullptr && p1 -> data != x){
                node* p2 = new node;
                p2 -> data = y;
                p2 -> next = nullptr;
                p1 -> next = p2;
                return;
            }
            // 否则继续遍历链表
            else p1 = p1 -> next;
        }
    }
}

// 删除函数
void delete_node(int x){
    node* p1 = p;
    while(p1 -> next != nullptr){
    	// 找到待删除元素
        if(p1 -> next -> data == x){
            node* p2 = p1 -> next;
            p1 -> next = p2 -> next;
            delete p2;
            break;
        }
        // 没找到
        else if(p1 -> next == nullptr && p1 -> data != x){
            return;
        }
        p1 = p1 -> next;
    }
}

int main(){
    int n;
    cin >> n;
    int i = 0;
    char str[7];
    int a;
    int b;
    int c;
    for(i = 0; i < n; i++){
        scanf("%s", &str);
        // 如果输入insert则进行insert操作,下面delete同理,不重复说明
        if(strcmp(str, "insert") == 0){
            scanf("%d %d",&a, &b);
            insert_node(a, b);
        }
        else if(strcmp(str, "delete") == 0){
            scanf("%d",&c);
            delete_node(c);
        }
    }
    
    node* p3 = p;
    // p中无元素
    if(p3 -> next == nullptr){
        cout << "NULL";
    }
    // 遍历输出
    else{
        p3 = p3 -> next;
        while(p3){
            cout << p3 -> data << ' ';
            p3 = p3 -> next;
        }
    }
    return 0;
}

你可能感兴趣的:(NewCoder,链表,数据结构,算法)