Как сдвигать элементы после добавления в двусвязный список - PullRequest
0 голосов
/ 18 февраля 2020

Я добавил элемент в указанную позицию в двусвязном списке, но я хочу сместить все элементы, которые были в этой позиции и после нее вправо? Любые советы о том, как подойти к этой проблеме?

public void addFirst(E e){
    DNode<E> headerNext = header.getNext();
    DNode<E> tempN = new DNode <E>(e, header, headerNext);
    headerNext.setPrev(tempN);
    header.setNext(tempN);
    size++;
}
public void add(int pos , E e ){
    DNode<E> ptr = new DNode<E> (e, null, null);
        if(pos == 1){
            addFirst(e);
            return;
        }
    DNode<E> optr = header;
    for (int i = 2; i <= size; i++) {
        if (i == pos) {
            DNode<E> tempN = optr.getNext();
            ptr.setNext(ptr);
            ptr.setPrev(optr);
            ptr.setPrev(tempN);
            tempN.setPrev(ptr);
        }
        ptr = ptr.getNext();
    }
    size++ ;
}
    }

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Любые советы о том, как подойти к этой проблеме?

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

Учитывая, что ниже приведен узел в двусвязном списке.

// Doubly Linked list Node
class Node { 
    int data; 
    Node prev; 
    Node next; 

    // Constructor to create a new node 
    // next and prev is by default initialized as null 
    Node(int d) { data = d; } 
}

Следующий метод может быть реализован для вашего двусвязного списка. Вы должны предоставить Узел, в который будет добавлен новый Узел после предоставленного Узла, а также указатели следующего и предыдущего для текущего Узла и вновь добавленного Узла будут обновлены для отражения вновь добавленного Узла.

/* Given a node (currentnode). insert a new node after the given 
  node(currentNode) */
public void InsertAfterNode(Node currentNode, int newData) 
{ 

// check if the given current node is NULL 
if (currentNode == null) { 
    System.out.println("The given current node cannot be NULL "); 
    return; 
} 

//  allocate node  
//  put in the data 
Node new_node = new Node(newData); 

//  Make next of new node as next of current node
new_node.next = currentNode.next; 

//  Make the next of current node as new_node
currentNode.next = new_node; 

//  Make current node as previous of new_node 
new_node.prev = currentNode; 

//  Change previous of new_node's next node 
if (new_node.next != null) 
    new_node.next.prev = new_node; 
} 

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

0 голосов
/ 18 февраля 2020

Пример на основе вашего комментария:

  1. Вам необходимо обновить следующий указатель нового узла, чтобы он указывал на адрес элемента 3
  2. Предыдущий указатель элемента 3 на адрес нового узла
  3. Новый предыдущий адрес узла с предыдущим адресом элемента 3
  4. Наконец, перейдите к предыдущему адресу (узлу) элемента 3 и обновите его следующий указатель на новый адрес узла.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...