如何将具有给定索引的新元素添加到链表中?

阮玉海

我正在学习 Java 中的链表,并尝试创建一个函数来将新点添加到具有给定索引的链表中。请帮我检查我的代码然后告诉我我在这里做错了什么。非常感谢您提前!!!!

我的程序有 2 个类名 Waypoint 和 TourElement。我也有一些测试用例。

航点

public class Waypoint {
    int x;
    int y;

    public int getX() {
        return this.x;
    }

    public int getY() {
        return this.y;
    }

    public void setXY(int x, int y) {
        this.x = x;
        this.y = y;
    }

    int[] toArray() {
        int array[] = new int[2];
        array[0] = getX();
        array[1] = getY();
        return array;
    }

    @Override
    public String toString() {
        String convertToString = "(" + getX() + "/" + getY() + ")";
        return convertToString;
    }

塔元素

public class TourElement {
    private Waypoint points;
    private TourElement next;

    public void setWaypoint( Waypoint points) {
        this.points = points; 
    }

    public void setNext(TourElement next) {
        this.next = next;
    }

    Waypoint getWaypoint() {
        return this.points;
    }

    TourElement getNext() {
        return this.next;
    }

    boolean hasNext() {
        if(this.next != null) {
            return true;
        }
        return false;
    }

    int getNoOfWaypoints() {//  return the number of waypoints in the list
    int count = 1;
    TourElement current = this;
    while(current.next != null) {
        count++;
        current = current.next;
        System.out.println(count);
    }
    return count;
}

这是插入具有给定索引的新点的函数:

TourElement insertAt(int index, Waypoint waypoint) {
    int lengthLinkList = getNoOfWaypoints();
    TourElement current = this;
    int count = 0;
    if(waypoint == null || index < 0 || index > lengthLinkList) {
        return this;
    } else {
        if(index == 0) {
            TourElement newElement = new TourElement();
            newElement.setWaypoint(waypoint);
            newElement.setNext(this);
            return newElement;
        } else {
            while(current.next != null) { //I think I'm doing wrong here when trying to add new points.
                if(index == count) {
                    TourElement newElement = new TourElement();
                    current.setNext(current);
                    newElement.setWaypoint(waypoint);
                    newElement.setNext(current.next);
                    return newElement;
                }
                count++;
                current = current.next;
           }
           if(current.next == null) {
            TourElement newElement = new TourElement();
            current.setNext(newElement);
            newElement.setWaypoint(waypoint);
            newElement.setNext(null);
           }
        }
        return this;
    }
}

这是我的测试用例://创建元素列表:

private Waypoint createWaypoint(int x, int y) {
        Waypoint wp = new Waypoint();
        wp.setXY(x, y);
        return wp;
    }

    /**
     * Creates a ElementList with the given waypoints.
     * @param waypoints array of waypoints to use, the coordinates of the waypoints are also in an array
     * @return List of elements with the given waypoints
     * @pre at least one waypoint has to be in array
     */
    private TourElement createElementList(int[][] waypoints){
        assert waypoints.length > 0;
        TourElement elem = new TourElement();
        int lastIndex = waypoints.length-1;
        Waypoint wp = createWaypoint(waypoints[lastIndex][0], waypoints[lastIndex][1]);
        elem.setWaypoint(wp);
        for (int i = lastIndex-1; i >= 0 ; i--) {
            wp = createWaypoint(waypoints[i][0], waypoints[i][1]);
            elem = elem.addStart(wp);
        }
        return elem;
    }

测试用例 1:通过

@Test
public void testInsertAt_BeforeFirst() {
    TourElement elem = createElementList(new int[][] {{1, 1}, {3, 3}});
    Waypoint wp = createWaypoint(0, 0);
    elem = elem.insertAt(0, wp);
    assertArrayEquals(new int[] {0, 0}, elem.getWaypoint().toArray());
    assertArrayEquals(new int[] {1, 1}, elem.getNext().getWaypoint().toArray());
    assertArrayEquals(new int[] {3, 3}, elem.getNext().getNext().getWaypoint().toArray());
    assertNull(elem.getNext().getNext().getNext());
}

测试用例 2:失败

错误是:数组首先在元素[0]处不同;期望 <2> 但是是:<3>

  @Test
    public void testInsertAt_Second() {
        TourElement elem = createElementList(new int[][] {{1, 1}, {3, 3}});
        Waypoint wp = createWaypoint(2, 2);
        elem = elem.insertAt(1, wp);
        assertArrayEquals(new int[] {1, 1}, elem.getWaypoint().toArray());
        assertArrayEquals(new int[] {2, 2}, elem.getNext().getWaypoint().toArray());
        assertArrayEquals(new int[] {3, 3}, elem.getNext().getNext().getWaypoint().toArray());
        assertNull(elem.getNext().getNext().getNext());
    }

测试案例3:通过

@Test
public void testInsertAt_Last() {
    TourElement elem = createElementList(new int[][] {{1, 1}, {3, 3}});
    Waypoint wp = createWaypoint(4, 4);
    elem = elem.insertAt(2, wp);
    assertArrayEquals(new int[] {1, 1}, elem.getWaypoint().toArray());
    assertArrayEquals(new int[] {3, 3}, elem.getNext().getWaypoint().toArray());
    assertArrayEquals(new int[] {4, 4}, elem.getNext().getNext().getWaypoint().toArray());
    assertNull(elem.getNext().getNext().getNext());
}

在函数中insertAt(index, waypoint),该函数在index = 0 或index = last 时通过。但我不明白为什么第二个测试用例没有通过。请帮我!!

莎朗·本·阿舍

如果您使用调试器运行,则可以检测到该问题。所以,首先,我不知道您使用的是哪个 IDE(如果有的话),但我强烈建议您熟悉这个工具。

现在,调试您的代码,我发现当您想在列表中的最后一个元素之前添加一个元素时会出现问题(与失败的测试用例一样)。您的循环while(current.next != null)在最后一个元素处停止。您假设此时您想在列表的末尾插入,而实际上,您想在最后一个元素之前插入。由于这是一个学习练习,我会让你自己解决这个问题。

另一条评论:在列表中间添加元素时,在完成插入后,您不必要地继续迭代循环。

祝你好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将新元素添加到现有数组中

如何将新元素添加到数组?

如何将css样式添加到新元素

如何将新元素添加到列表?

如何将一维 NumPy 数组的元素添加到具有相同索引的 NumPy 子数组中?

将新元素添加到现有XML中

如何将新元素添加到列表中的 pandas.DataFrame 列?

如何将包含等号的新元素添加到R中的字符向量

如何将Series添加到DataFrame中具有自定义索引

我如何将元素添加到具有模型类型的列表中

如何将类添加到给定的元素?

如何将类添加到给定的元素?

XSLT元素将属性添加到新元素中

如何将新元素添加到 JSON 文件的末尾?

如何将新元素添加到 const char ** 数组

如何将类添加到具有不在数组中的类名称的元素中

将具有索引的元素添加到PostgreSQL中的数组

如何将某些元素添加到由具有某些方法的类创建的堆栈中

将新元素添加到c中的struct数组

将新元素添加到雄辩的收藏中

如何将 eventListener 函数添加到具有唯一 ID 的元素?

将新元素添加到列表

如何将 5 添加到数组的每个元素并用新元素替换旧元素(+5 之后)?

如何将元素添加到现有元素而不是在列表中覆盖它们?

如何创建一个将新元素添加到空数组(JS)中的函数?

如何将ngClick添加到现有元素

如何将元素添加到数组中的对象

当我将新元素添加到顶部时,如何将位置保持在可滚动列表中?

如何将值添加到具有对应名称的数组中的键值中