如何在链接列表中的某个索引处插入项目?

How do I insert an Item at a certain Index in a Linked List?

我正在为我的数据结构 class 开发一个项目,该项目要求我编写一个 class 来实现一个整数链表。

  • Use an inner class for the Node.
  • Include the methods below.
  • Write a tester to enable you to test all of the methods with whatever data you want in any order.

我必须创建一个名为“public void insertAt(int index, int item)”的方法。此方法旨在“在位置索引处插入一个项目,其中索引传递给方法”我在下面有此方法的代码。当我执行此方法时,什么也没有发生。我尝试添加到特定索引的项目永远不会被添加。有人知道我做错了什么吗?以及如何解决?

import java.util.Random;
import java.util.Scanner;

public class LinkedListOfInts {
    Node head;
    Node tail;

    private class Node {
        int value;
        Node nextNode;

        public Node(int value, Node nextNode) {
            this.value = value;
            this.nextNode = nextNode;
        }

    }

    public LinkedListOfInts(LinkedListOfInts other) {
        Node tail = null;
        for (Node n = other.head; n != null; n = n.nextNode) {
            if (tail == null)
                this.head = tail = new Node(n.value, null);
            else {
                tail.nextNode = new Node(n.value, null);
                tail = tail.nextNode;
            }
        }
    }

    public LinkedListOfInts(int[] other) {
        Node[] nodes = new Node[other.length];
        for (int index = 0; index < other.length; index++) {
            nodes[index] = new Node(other[index], null);
            if (index > 0) {
                nodes[index - 1].nextNode = nodes[index];
            }
        }

        head = nodes[0];
    }

    public LinkedListOfInts(int N, int low, int high) {
        Random random = new Random();
        for (int i = 0; i < N; i++)
            this.addToFront(random.nextInt(high - low) + low);
    }

    public void addToFront(int x) {
        head = new Node(x, head);
    }

    public void insertAt(int index, int item) {
        Node temp = head;
        Node prev = null;
        int i = 0;
        for (Node ptr = head; ptr != null; ptr = ptr.nextNode) {
            prev = temp;
            temp = temp.nextNode;
            i++;
        }
        if (index == i) {
            Node newItem = new Node(item, null);
            prev.nextNode = newItem;
            newItem.nextNode = temp;
        }
    }

    public String toString() {
        String result = "";
        for (Node ptr = head; ptr != null; ptr = ptr.nextNode) {
            if (!result.isEmpty()) {
                result += ", ";
            }
            result += ptr.value;
        }
        return "[" + result + "]";
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        LinkedListOfInts list = new LinkedListOfInts(10, 1, 20);
        boolean done = false;
        while (!done) {
            System.out.println("1. Insert At");
            System.out.println("2. toString");
            switch (input.nextInt()) {
            case 1:
                System.out.println("Insert an Item to a certain Index on the List");
                list.insertAt(input.nextInt(), input.nextInt());
                break;
            case 2:
                System.out.println("toString");
                System.out.println(list.toString());
                break;

            }
        }
    }
}

有一些问题,但你已经解决了大部分问题,你只需要将 if 语句 if (index == i) {Node newItem... } 移动到你的 'for' 循环中,如下所示:

public void insertAt(int index, int item) {
    Node temp = head;
    Node prev = null;
    int i = 0;
    for (Node ptr = head; ptr != null; ptr = ptr.nextNode) {
        prev = temp;
        //Make sure the next node is not null
        if (temp.nextNode != null) {
            temp = temp.nextNode;
        }

        //Move the if check here inside the for loop, but before i++
        if (index == i) {
            Node newItem = new Node(item, null);
            prev.nextNode = newItem;
            //Make sure the next node is not null
            if (temp.nextNode != null) {
                newItem.nextNode = temp;
            }
        }

        //now advance the index after the above
        i++;
    }
}

请注意,您的代码有一个错误,该错误已通过检查下一个节点不为空来修复。

我们可以通过在索引 2 后插入 999 来看到更新后的方法有效:

1. Insert At
2. toString
1
Insert an Item to a certain Index on the List
2 999
1. Insert At
2. toString
2
toString
[5, 18, 8, 999, 11, 11, 1, 19, 3, 1, 10]
1. Insert At
2. toString

如果您希望将项目插入到索引 2 处,请调整顺序并将 if 语句放在 prev = temp;

之前