При вставке элемента в первую позицию возвращается неверный связанный список - PullRequest
0 голосов
/ 13 апреля 2020

Я новичок и практиковал программу по вставке узла на первой позиции, когда несколько элементов уже присутствуют в связанном списке. Вот мой фрагмент кода

class LinkedList{
    int data;
    LinkedList next;

    void insertNodeAtTheEnd(int d, LinkedList head){
        LinkedList temp;
        temp = head;
        while(temp.next != null){
            temp = temp.next;
        }
        LinkedList newNode = new LinkedList();
        newNode.data = d;
        newNode.next = null;
        temp.next = newNode;
    }

    void insertNodeAtGivenPosition(int d , int pos , LinkedList head){
        LinkedList temp;
        temp = head;
        int tempPos = 1;
        LinkedList newNode = new LinkedList();
        LinkedList before = temp;
        if(pos == 1){

            newNode.data = d;
            newNode.next = temp;
            temp = newNode;     
        }
        else { 
            while(temp != null){
                if(pos == tempPos){
                    newNode.data = d;
                    newNode.next = before.next ;
                    before.next = newNode;
                }

                before = temp ;
                temp = temp.next ;
                tempPos++;
            }   
        }   
    }

    void printLinked(LinkedList head){
        LinkedList temp = head;
        while(temp.next != null){
            System.out.print(temp.data + "->");
            temp = temp.next;
        }
        System.out.print(temp.data +"\n");
    }

}

class LinkedListMain{
    public static void main(String[] args){

        LinkedList node1 = new LinkedList();
        node1.data = 10;
        node1.next = null;

        LinkedList head;
        head = node1;

        head.insertNodeAtTheEnd(8, head);
        head.insertNodeAtTheEnd(6, head);
        head.insertNodeAtTheEnd(7, head);
        head.insertNodeAtTheEnd(11, head);
        head.insertNodeAtTheEnd(5, head);
        head.insertNodeAtTheEnd(2, head);
        head.printLinked(head);
        head.insertNodeAtGivenPosition(4 , 3 , head);  //line 1
        head.printLinked(head);
        head.insertNodeAtGivenPosition(1 , 1 , head);  //line2
        head.printLinked(head);             
    }
}

. Для приведенного выше кода, после вставки элемента в третью позицию (строка 1) с использованием метода "insertNodeAtGivenPosition ()", код работает нормально, и результат показан ниже

10->8->6->7->11->5->2
10->8->4->6->7->11->5->2

Но когда я пытаюсь использовать тот же лог c для вставки элемента в первую позицию (строка 2) и печати списка, первый элемент не вставляется, и вывод выглядит как

10->8->6->7->11->5->2
10->8->4->6->7->11->5->2
10->8->4->6->7->11->5->2

Что я делаю не так? Кажется, есть некоторая проблема со значением «голова».

1 Ответ

0 голосов
/ 13 апреля 2020

Чтобы вставить в начале, вы должны изменить head для ссылки на новый узел. Однако head передается в ваш метод, который не может его изменить.

Для того, чтобы это работало, вам нужно вернуть новое head:

LinkedList insertNodeAtGivenPosition(int d , int pos , LinkedList head){
    LinkedList temp;
    temp = head;
    int tempPos = 1;
    LinkedList newNode = new LinkedList();
    LinkedList before = temp;
    if(pos == 1) {
        newNode.data = d;
        newNode.next = head;
        head = newNode;     
    } else { 
        while(temp != null){
            if(pos == tempPos){
                newNode.data = d;
                newNode.next = before.next;
                before.next = newNode;
            }

            before = temp;
            temp = temp.next;
            tempPos++;
        }   
    }   
    return head;
}

И вызов метода должен быть:

head = head.insertNodeAtGivenPosition(1 , 1 , head);

Конечно, вам не нужен аргумент head, так как это метод экземпляра, поэтому вы можете изменить его на:

LinkedList insertNodeAtGivenPosition(int d , int pos) {
    LinkedList head = this;
    LinkedList temp = head;
    int tempPos = 1;
    LinkedList newNode = new LinkedList();
    LinkedList before = temp;
    if(pos == 1){
        newNode.data = d;
        newNode.next = head;
        head = newNode;     
    } else { 
        while(temp != null) {
            if(pos == tempPos){
                newNode.data = d;
                newNode.next = before.next ;
                before.next = newNode;
            }

            before = temp ;
            temp = temp.next ;
            tempPos++;
        }   
    }   
    return head;
}

и позвоните по этому номеру:

head = head.insertNodeAtGivenPosition(1 , 1);
...