题目:通过只调整链(而不是数据)来交换两个相邻的元素,使用单链表下面是我写的,原链表是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;
}
}}
/**
* 交换整个链表中相邻的两个整链(不是数据),分别做单链表与双链表的,不考虑循环链表
* @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、沿用你的思路,再加一个参数:前接节点(如你要交换2、3节点,这个前接节点就是1)
2、只要一个参数,这个参数就是“前接节点”,方法体的内容就是交换“前接节点”的后续两个节点的位置。
{
String data;
Node1 previous;
Node1 next;
public Node1(String str)
{
data = str;
}
}
通过head遍历出previous的前node
应该修改N2前一个节点的next,使之1->3->2>4.建议传入一个三个参数head,current,next.
head遍历可以得到previous.
temp = current.next
current.next = next.next;
next.next = current;
previous.next = temp