如何用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
相关产品推荐
相关产品推荐

