在Java中实现的链表中的交换对元素

时间:2014-01-31 23:00:19

标签: java linked-list nodes swap

我已经为swaplinkedList的{​​{1}}元素编写了代码。 目前,我的代码失败了,即它不是Java个元素。我遇到了困难 关于如何处理这个问题。有什么提示吗?

swapping

6 个答案:

答案 0 :(得分:3)

我解决这个问题的方法是

  1. 为最简单的情况,以正确的格式为linkedList和所需的input绘制output。在这里,我将从4个节点开始;

  2. 然后解决简单的情况,例如ListNodenext为空

  3. 在纸上,标记已损坏的链接和已形成的链接。请注意,您必须按正确的顺序进行分解和链接;确保您reference的{​​{1}}链接正在破坏。否则你可能会失去一些节点。这就是整个关键所在。在节点断开或形成链接时在每个步骤之后绘制。通过这种方式,您可以跟踪正在发生的事情;

  4. 将您在纸上绘制的内容翻译成代码。那一定相当简单! 通常你需要有临时指针来遍历列表;

  5. 在此示例中,需要更改nodesfront指针。所以我会在迭代之外进行第一次交换。我将在head内进行剩余的更改。

  6. 编写一个方便的while loop方法,可以帮助您跟踪每个阶段的变量。我发现toStringdebuggers使用recusions更加困难。但那只是我。

  7. 关于这个问题的解决方案:在我看来,这不是一个简单的问题。但是要好好掌握linkedLists Pointers`

    这是我的解决方案:

    linkedLists and

答案 1 :(得分:1)

回答这样的问题的最佳方法是在列表进行迭代过程中可视化列表的状态。我用println实现了代码来帮助解决这个问题。另一种选择是包含更容易跟踪的变量名称,而tempdummy不会阻止您实现更难以遵循的正确性。

这是功能

    public ListNode switchPairs(){
        if (this==null || this.next==null)
            return this;
        ListNode top = this.next;

        ListNode first = this;
        ListNode second = first.next;

        do {
            ListNode third = second.next;
            second.next = first;
            first.next = third;
            first = third;
            System.out.println("@@@ " + top.toString());
            if (first != null) {
                // remember second now is really the first element on the list
                // at this point.
                second.next.next = first.next;
                second = first.next;
            }

        } while(first != null && second != null);

        return top;
    }

这是整个代码

public class ListNode {
    private ListNode next = null;
    private final int i;
    ListNode(int i) {
        this.i = i;
    }

    ListNode(int i, ListNode parent) {
        this(i);
        parent.next = this;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[" + this.i + "]");
        if (this.next != null) {
            sb.append("->");
            sb.append(this.next.toString());
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        ListNode top = null;
        ListNode curr = null;
        for(String arg : args) {
            int i = Integer.parseInt(arg);
            if(curr == null) 
                curr = new ListNode(i);
            else
                curr = new ListNode(i, curr);
            if( top == null) 
                top = curr;
        }
        System.out.println(top.toString());
        top = top.switchPairs();
        System.out.println(top.toString());
    }

    public ListNode switchPairs(){
        if (this==null || this.next==null)
            return this;
        ListNode top = this.next;

        ListNode first = this;
        ListNode second = first.next;

        do {
            ListNode third = second.next;
            second.next = first;
            first.next = third;
            first = third;
            System.out.println("@@@ " + this.toString());
            if (first != null) {
                second.next.next = first.next;
                second = first.next;
            }

        } while(first != null && second != null);

        return top;
    }
}

最后但并非最不重要的一个示例输出

java ListNode 1 2 3 4 5 6 7 8
[1]->[2]->[3]->[4]->[5]->[6]->[7]->[8]
@@@ [2]->[1]->[3]->[4]->[5]->[6]->[7]->[8]
@@@ [2]->[1]->[4]->[3]->[5]->[6]->[7]->[8]
@@@ [2]->[1]->[4]->[3]->[6]->[5]->[7]->[8]
@@@ [2]->[1]->[4]->[3]->[6]->[5]->[8]->[7]
[2]->[1]->[4]->[3]->[6]->[5]->[8]->[7]

答案 2 :(得分:1)

public void switchPairs() {
   ListNode prev = front;
    if(front!=null && front.next != null) {
        ListNode temp = front;
        front = front.next;
        temp.next = front.next;
        front.next = temp;
        prev = temp;
    }
    while(prev !=null && prev.next != null && prev.next.next != null) {
        ListNode first_node =prev.next;
        ListNode second_node = first_node.next;
        first_node.next = second_node.next;
        second_node.next = first_node;
        prev.next = second_node;
        prev = first_node;
    }
}

答案 3 :(得分:0)

// Recursive solution
public void switchPairs(SingleLinkListNode prev, SingleLinkListNode node) {

    if (node == null || node.next == null) {
        return;
    }
    SingleLinkListNode nextNode = node.next;
    SingleLinkListNode temp = nextNode.next;
    nextNode.next = node;
    node.next = temp;
    if (prev != null) {
        prev.next = nextNode;
    } else {
        head = nextNode;
    }

    switchPairs(node, node.next);
}

答案 4 :(得分:0)

我有这个递归函数,它有效:

    public void swap2List(){
    root = swap2List(root);   //pass the root node
    }   
    private Node swap2List(Node current){
    if(current == null || current.next == null){
    return current;
    }
    else{
    Node temp = current;
    Node temp2 = current.next.next;
    current = current.next;
    current.next = temp;
    temp.next = swap2List(temp2);       
    } 
    return current;
    }

答案 5 :(得分:-1)

public static LinkedList<Integer> switchPairs(LinkedList list) { ListIterator<Integer> iterator = list.listIterator(); LinkedList<Integer> out = null; while (iterator != null && iterator.hasNext()) { if (out == null) { out = new LinkedList<Integer>(); } int temp = iterator.next(); if (iterator.hasNext()) { out.add(iterator.next()); out.add(temp); }else{ out.add(temp); } } return out; }