You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用linkedStack删除指定ID元素 调用clear()清空全部记录如何解决

按ID删除栈中指定歌手记录的解决方案

问题根因

你当前的代码逻辑是遍历到匹配ID的歌手时直接调用栈的clear()方法,该方法的实现是直接将栈顶指针置空,会清空栈内所有元素,完全不符合单条删除的需求。

实现思路

栈是后进先出的线性结构,本身不支持直接随机访问删除中间元素,因此需要借助临时栈完成单条删除:

  • 依次弹出原栈的元素,判断当前元素ID是否为目标ID
  • 非目标元素全部推入临时栈存储
  • 遇到目标ID的元素直接丢弃,不推入临时栈
  • 目标元素删除完成后,将临时栈的所有元素依次弹出,重新推回原栈即可保留其他元素的原有顺序

代码实现

首先补充栈必要的基础操作方法:

// 判断栈是否为空
public boolean isEmpty() {
    return topNode == null;
}

// 弹出栈顶元素并返回
public Singer pop() {
    if (isEmpty()) return null;
    Singer data = topNode.data;
    topNode = topNode.next;
    return data;
}

// 向栈顶压入元素
public void push(Singer singer) {
    Node newNode = new Node(singer);
    newNode.next = topNode;
    topNode = newNode;
}

修改后的单条删除方法:

private static Singer DeleteSpecificSinger(int id){
    Stack<Singer> tempStack = new Stack<>();
    Singer deletedSinger = null;
    // 遍历原栈查找目标元素
    while (!singerList.isEmpty()) {
        Singer current = singerList.pop();
        if (current.getId() == id) {
            deletedSinger = current;
            // 找到目标直接丢弃,不需要推入临时栈
            break;
        }
        tempStack.push(current);
    }
    // 临时栈元素回推原栈,恢复原有顺序
    while (!tempStack.isEmpty()) {
        singerList.push(tempStack.pop());
    }
    return deletedSinger;
}

补充说明

  • 如果需要删除所有匹配ID的记录,删除上述代码中匹配成功后的break语句即可
  • 该方案时间复杂度为O(n),n为栈内元素总数,最坏情况需要遍历所有元素才能找到目标记录

内容的提问来源于stack exchange,提问作者fallenhamster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:09:01