交换单个链表的2个节点。我有这个程序。我需要问一下它的错误

时间:2015-01-02 10:12:57

标签: linked-list

我写了以下程序。如果我调试它,交换工作正常。但是我无法返回完整的链表。它正在改变头脑。怎么了?

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;
}

1 个答案:

答案 0 :(得分:0)

是的,您的head正在修改

temp.next = toSwap2.next;

因为temp指向head。以下是解决问题的方法:
首先,

prev2 = prev1;
toSwap2 = toSwap1;

可以在while循环之外编写。

现在,在第二个while循环toSwap1toSwap2指向要交换的元素之后。

// 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;