2015-01-02 3 views
0

Я написал следующую программу. Swap работает нормально, если я его отлаживаю. Однако я не могу вернуть полный список ссылок. Он также меняет голову. что не так?Обмен двумя узлами одного связанного списка. У меня есть программа. Мне нужно спросить, где его неправильно

public static Node<Integer> swapElementsAtiAndj(Node<Integer> head, int i, int j) 
{ 

    Node<Integer> temp= head; 
    Node<Integer> prev1 = temp; 
    Node<Integer> prev2 = temp; 
    Node<Integer> toSwap1 = temp; 
    Node<Integer> toSwap2 = temp; 
    int count =0; 
    int pos1 =i; 
    int pos2 =j; 
    if(i>j) { 
     pos1 = j; 
     pos2 =i; 
    } 
    while (count !=pos1) { 
     prev1 = toSwap1; 
     toSwap1 = toSwap1.next; 
     prev2 = prev1; 
     toSwap2 = toSwap1; 
     count++; 
    } 

    while(count != pos2) { 
     prev2 = toSwap2; 
     toSwap2 = toSwap2.next; 
     count++; 
    } 
    temp.data = toSwap1.data; 
    temp.next = toSwap2.next; 
    toSwap2.next = toSwap1.next; 
    prev2.next = temp; 
    prev1.next = toSwap2; 


    return head; 
} 
+0

Вы изменяете температуру, которая является головкой. BTW: вы не должны инициализировать переменные со значениями, которые вам не нужны. – eckes

ответ

0

Да, ваш head становится модифицирована в

temp.next = toSwap2.next; 

Поскольку temp указывает на head. Вот как вы можете это исправить:
Прежде всего,

prev2 = prev1; 
toSwap2 = toSwap1; 

может быть записана вне while цикла.

Теперь, после второго while петля toSwap1 и toSwap2 указывают на элементы, подлежащие обмену.

// Swap prev 
prev1.next = toSwap2; 
prev2.next = toSwap1; 

// Store toSwap2's next in temp 
temp = toSwap2.next; 

// Set toSwap2's next to toSwap1's next 
toSwap2.next = toSwap1.next; 

// Set toSwap1's next to old toSwap2's next (i.e temp) 
toSwap1.next = temp; 

// Return 
return head; 
Смежные вопросы