题目:通过只调整链(而不是数据)来交换两个相邻的元素,使用单链表下面是我写的,原链表是1-->2-->3-->4,修改2,3以后链表应该为1-->3-->2-->4,我修改完以后不会把1指向3,1还是指向2,请问我的程序怎么改?什么思路?package com.wwy.thirdTest;
/**
 * 交换整个链表中相邻的两个整链(不是数据),分别做单链表与双链表的,不考虑循环链表
 * @author wWX161568
 *
 */
public class Test3_2 { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Node1 n1 = new Node1("111");
Node1 n2 = new Node1("222");
Node1 n3 = new Node1("333");
Node1 n4 = new Node1("444");

n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = null;
//1-->2-->3-->4
System.out.println("n2 --> n3" + n2.next.data);
//互换后的链表结构1-->3--2--4
exchangeSingle(n2,n3);

System.out.println("n3 --> n2" + n1.next.data);
}

/**
 * 单链表节点类
 * @author wWX161568
 *
 */
private static class Node1
{
String data;
Node1 next;

public Node1(String str)
{
data = str;
}
}

/**
 * 单链表相邻两个节点互换
 * @param previous
 * @param next
 */
public static void exchangeSingle(Node1 previous,Node1 next)
{
if(previous.next != next)
{
System.out.println("不是两个相邻的节点,请检查!!!");
}
else
{
//把前一个节点指向后一个节点的下一个节点
previous.next = next.next;
//在吧后一个节点的下一个节点指向前一个节点
next.next = previous;
}
}}

解决方案 »

  1.   

    你的exchangeSingle方法设计有明显的缺陷。
    因为是链表,所以它有前有后,你只给出了要交换位置的两个节点,请问前面指向他们的节点呢?没这个节点你怎么保持完整的链表?
    所以你的改变这个方法的设计,我这里有两个方案
    1、沿用你的思路,再加一个参数:前接节点(如你要交换2、3节点,这个前接节点就是1)
    2、只要一个参数,这个参数就是“前接节点”,方法体的内容就是交换“前接节点”的后续两个节点的位置。
      

  2.   

    如果在你的应用设计里头,真的没办法知道“前一个节点”,那么就得改变你的节点结构,增加一个指向前置节点的引用,如:private static class Node1
        {
            String data;
            Node1 previous;
            Node1 next;
             
            public Node1(String str)
            {
                data = str;
            }
        }
      

  3.   

    在你的方法中 除了参数previous和next,再传个参数head
    通过head遍历出previous的前node
      

  4.   

    你没有修改N2前一个节点的next,所以还是1->2,你的逻辑执行后1->2, 3—>2->4.
    应该修改N2前一个节点的next,使之1->3->2>4.建议传入一个三个参数head,current,next.
    head遍历可以得到previous.
    temp = current.next
    current.next = next.next;
    next.next = current;
    previous.next = temp