我使用的是一个单链表,其中节点类型为Segment,每个segment都指向一个位置和一种颜色。我的列表描述了一个毛毛虫,所以我不希望有不连续性-即如果我删除一个7段毛毛虫的第2、第4和第6段,我希望第3段占据第2段的位置,第5段占据第3段的位置,但是我当然希望新的第二段保留第三段的颜色。最后,我想把所有我不再使用的位置--比如第五、第六和第七段指向的最后三个位置--添加到我的堆栈中,称为previouslyOccupiedPositions。
以下是我目前为止的代码:
// the caterpillar devours a slide of Swiss cheese, losing half of its segments.
public void eat(SwissCheese cheese) {
if (this.length <= 1) {
return;
}
Stack<Position> positionsKept = new Stack<>();
Stack<Position> positionsRemoved = new Stack<>();
Segment temp = this.head;
boolean removeSegment = false;
while (temp != null) {
if (!removeSegment) {
positionsKept.push(temp.position);
}
else {
positionsRemoved.push(temp.position);
}
removeSegment = !removeSegment;
temp = temp.next;
}
this.length = (this.length +1)/2;
this.head = new Segment(positionsKept.pop(), this.head.color);
Segment curr = this.head;
while (!positionsKept.isEmpty()) {
curr.next = new Segment(positionsKept.pop(), curr.next.next.color);
curr = curr.next;
}
while (!positionsRemoved.isEmpty()) {
positionsPreviouslyOccupied.push(positionsRemoved.pop());
}
}
字符串
这有意义吗?我在最后一段代码中遇到了一个问题,我将head分配给一个新的Segment类型的对象,然后。
1条答案
按热度按时间pkmbmrz71#
你有一个经典的问题,从单链表中删除一个项目。这不依赖于项目的数据。
你应该定义一个容器的类。和内部项表示(一个节点的数据和对下一个节点的引用)。最后实现删除方法。
如何从单链表中删除randome方法:
1.找到项目(例如
A
)。1.查找前一项(例如
preA
)1.查找下一个项目(例如
nextA
)1.将引用从
preA -> A
更改为preA -> nextA
1.删除参考
A -> null
所以你的容器可能看起来像这样:
字符串
然后,例如,如果你想删除每个
2nd
元素,那么它可能看起来像这样:型
或者删除每个
1st
元素:型