链表.头部和尾部引用



我试图向我的链表类创建一个添加和删除方法。我用头和尾的名字做了 2 次引用。

头部 -> 1 -> 2 -> 3 -> 尾部:空

当我尝试删除特定节点时,我不断遇到问题,因为 Java 说我越界了。我想这是因为我的头没有指向第一个节点?你们怎么看?还是我完全错误地这样做...

public class LinkedList{
private Node head;
private Node tail;
private int listCount;
public LinkedList()
{
head = new ListNode(null);
tail = new ListNode(null);
listCount = 0;
}
public void add(Object elem){
ListNode newNode = new ListNode(elem);
if (size() == 0){
newNode = head;
tail = head;
}
newNode.setLink(tail);
tail = newNode;
listCount++;
}
public Object delete(int index)
// post: removes the element at the specified position in this list.
{
// if the index is out of range, exit
if(index < 1 || index > size())
throw new IndexOutOfBoundsException();
ListNode current = head;
for(int i = 1; i < index; i++)
{
if(current.getLink() == null)
throw new IndexOutOfBoundsException();
current = current.getLink();
}
current.setLink(current.getLink().getLink());
listCount--; // decrement the number of elements variable
return current.getInfo();
}
public int size() {
return listCount;
}
}
public class Node {
private Node link;
private Object info;
public Node(Object info)
{
this.info = info;
link = null;
}
public void setInfo(Object info)
{
this.info = info;
}
public Object getInfo()
{
return info;
}
public void setLink(Node link)
{
this.link = link;
}
public Node getLink()
{
return link;
}
}

我认为这是因为您的head永远不会链接到任何东西。我要做的是在您的添加方法中修复它,检查列表的size;如果为 0,则将 head 设置为新元素,并将tail设置为等于head。如果为 1,则将head链接到新节点并设置tail。如果为 2,只需将tail的链接设置为新节点并设置tail(就像您现在一样)。

另外,我不确定您是如何实现它的,但newNode.setLink(tail);似乎错了......tail应链接到newNode。从它的外观来看,你似乎正在尝试做newNode->尾巴

。编辑:好的,这就是为什么我会尝试

public void add(Object elem){
ListNode newNode = new ListNode(elem);
if (size() == 0){
newNode = head;
tail = head;
}else if(size() == 1){
head.setLink(newNode);
tail = newNode;
}else{
tail.setLink(newNode);
tail = newNode;
}
listCount++;
}

看起来您在设置初始(空)链表时没有从头到尾初始化链接。

还行。 以下是使用单向链表(仅限转发链接)时使用的策略。您需要确定列表中允许哪些操作(例如,仅从头部或尾部添加/删除?;或在链表中的任意位置添加和删除节点(一旦您删除了一个节点,就将列表重新组合在一起)。如果您允许从任何地方删除节点,那么您需要有一种唯一标识每个节点的方法(以便您可以明确确定要删除的节点)。 您可能还希望能够在其他节点之前或之后添加一个节点。为此可能需要独特性。 如果您不在乎在之前/之后删除或添加哪个值,则可以放宽唯一性约束。

现在实施战略。从头部开始(最初为空)。

  1. 要添加节点,请向下浏览链表,直到找到空的下一个链接。将其替换为您的节点,并将您的节点转发链接设置为 null。 (提高效率,有一个尾巴总是在链表中具有最后一个节点,或者如果列表中没有任何内容,则为 null)。
  2. 要删除节点,请遍历列表,直到找到要删除的节点,将上一个链接更改为要删除的节点中的链接(您现在已完成)
  3. 要在列表末尾添加节点,请转到尾部指向的链接(如果为 null,则列表为示例);将其链接更改为节点,确保新节点的链接中为 null;并将尾部设置为节点
  4. 计算链表的大小,请遍历树并计数(或者,为了提高计算效率,请保持一个在添加或删除节点时递增或递减的运行大小。

这有帮助吗?

查看此链接以获取完整说明!

最新更新