, ,

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

描述 定义一种单向链表的构造方法如下所示:∙ ∙先输入一个整数 nn ,代表链表中节点的总…

描述

定义一种单向链表的构造方法如下所示:
∙先输入一个整数 nn ,代表链表中节点的总数;
∙再输入一个整数 hh ,代表头节点的值;
∙此后输入 n1n−1 个二元组 (a,b)(a,b) ,表示在值为 bb 的节点后插入值为 aa 的节点。
除此之外,保证输入的链表中不存在重复的节点值。

现在,对于给定的链表构造方法和一个额外的整数 kk ,你需要先按照上述构造方法构造出链表,随后删除值为 kk 的节点,输出剩余的链表。

输入描述:

在一行上:
1.1.​先输入一个整数 n(1n103)n(1≦n≦103) 代表链表中节点的总数;
2.2.​随后输入一个整数 h(1h104)h(1≦h≦104) 代表头节点的值;
3.3.​随后输入 n1n−1 个二元组 (a,b)(1a,b104)(a,b)(1≦a,b≦104) ;
4.4.​最后输入一个整数 kk ,代表需要删除的节点值。

除此之外,保证每一个 bb 值在输入前已经存在于链表中;每一个 aa 值在输入前均不存在于链表中。节点的值各不相同。

输出描述:

在一行上输出 n1n−1 个整数,代表删除指定元素后剩余的链表。

示例1

输入:

5 2 3 2 4 3 5 2 1 4 3

复制

输出:

2 5 4 1

复制

说明:

在这个样例中,链表的构造过程如下:
∙头节点为 22 ,得到链表 [2][2] ;
∙在 22 后插入 33 ,得到链表 [2,3][2,3] ;
∙在 33 后插入 44 ,得到链表 [2,3,4][2,3,4] ;
∙在 22 后插入 55 ,得到链表 [2,5,3,4][2,5,3,4] ;
∙在 44 后插入 11 ,得到链表 [2,5,3,4,1][2,5,3,4,1] ;
随后,删除值为 33 的节点,得到链表 [2,5,4,1][2,5,4,1] 。

示例2

输入:

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

复制

输出:

7 3 1 5 4

复制

说明:

在这个样例中,链表的构造过程如下:
∙头节点为 22 ,得到链表 [2][2] ;
∙在 22 后插入 11 ,得到链表 [2,1][2,1] ;
∙在 22 后插入 33 ,得到链表 [2,3,1][2,3,1] ;
∙在 11 后插入 55 ,得到链表 [2,3,1,5][2,3,1,5] ;
∙在 55 后插入 44 ,得到链表 [2,3,1,5,4][2,3,1,5,4] ;
∙在 22 后插入 77 ,得到链表 [2,7,3,1,5,4][2,7,3,1,5,4] ;
随后,删除值为 22 的节点,得到链表 [7,3,1,5,4][7,3,1,5,4] 。

采用链表结构,结构化数据

const allArr = (await readline()).split(" ").map(Number);
    //console.log(allArr,'allArr');
    const [size,headVal,...arr] = allArr
    const k = arr.pop();
    let ptr = 0;
    const hash = new Map();
    const head = new LinkNode(headVal);
    hash.set(headVal, head);
    //console.log(arr);
    for(let i=0;i<size-1;i++){
        const a = arr[ptr++];
        const b = arr[ptr++];
        
        const newNode = new LinkNode(a);
        const parentNode = hash.get(b);
        //将老的节点接入新节点后面
        newNode.next = parentNode.next;
        parentNode.next = newNode;
        hash.set(a, newNode);
    }

封装删除功能

//删除
    const removeLink=(link,delVal)=>{
        let cur = link;
        const curVal = link.val;
        if(curVal === delVal){
            link = {};
        }
       // console.log(cur,'cur');
        while(cur.next){
            const tempCur = cur.next;
            const tempVal = tempCur.val; 
            //console.log(tempCur,'tempVal');
            if(tempVal === delVal){
                //console.log("删除",delVal);
                const nextNode = tempCur.next;
                if(nextNode){
                    //console.log("删除");
                    cur.next = nextNode;
                }else{  
                    cur.next = null;
                }
            }else{
                cur = tempCur;
            }
        }
    }
    //console.log(k,'k');
    removeLink(head,k);

完整

function LinkNode(x){
    this.val = x;
    this.next = null;
}

void async function () {
    // Write your code here
    const allArr = (await readline()).split(" ").map(Number);
    //console.log(allArr,'allArr');
    const [size,headVal,...arr] = allArr
    const k = arr.pop();
    let ptr = 0;
    const hash = new Map();
    const head = new LinkNode(headVal);
    hash.set(headVal, head);
    //console.log(arr);
    for(let i=0;i<size-1;i++){
        const a = arr[ptr++];
        const b = arr[ptr++];
        
        const newNode = new LinkNode(a);
        const parentNode = hash.get(b);
        //将老的节点接入新节点后面
        newNode.next = parentNode.next;
        parentNode.next = newNode;
        hash.set(a, newNode);
    }
    //console.log(JSON.stringify(head));

    //删除
    const removeLink=(link,delVal)=>{
        let cur = link;
        const curVal = link.val;
        if(curVal === delVal){
            link = {};
        }
       // console.log(cur,'cur');
        while(cur.next){
            const tempCur = cur.next;
            const tempVal = tempCur.val; 
            //console.log(tempCur,'tempVal');
            if(tempVal === delVal){
                //console.log("删除",delVal);
                const nextNode = tempCur.next;
                if(nextNode){
                    //console.log("删除");
                    cur.next = nextNode;
                }else{  
                    cur.next = null;
                }
            }else{
                cur = tempCur;
            }
        }
    }
    //console.log(k,'k');
    removeLink(head,k);
    //console.log(JSON.stringify(head));
    const res = [];
    let itear = head;
    while(itear){
        //console.log(itear.val);
        res.push(itear.val);
        const temp = itear.next;
        itear = temp;
    }
    console.log(res.join(" "));
}()

采用数组方式


void async function () {
    let [total,head,...arr] = (await 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(' '))

}()

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor