Java 变换双链表

Java 变换双链表,java,list,transform,nodes,Java,List,Transform,Nodes,我需要以这种方式转换DLL: 给定n(节点数)和四个整数(a,b,c,d),表示两个间隔a,b和b,c。例如: N: 7 Input list: 1 2 3 4 5 6 7 a,b = 2 3 c,d = 5 6 我需要做的是交换给定间隔中的节点,因此输出应该是: 1 **5 6** 4 **2 3** 7 如您所见,元素为2和3的节点与元素为5和6的节点交换了位置 输入的其他方式可以如下所示: N:5 Input: 10 50 40 25 1 a, b: 10 10 c, d:

我需要以这种方式转换DLL: 给定n(节点数)和四个整数(a,b,c,d),表示两个间隔a,b和b,c。例如:

N: 7

Input list:

1 2 3 4 5 6 7

a,b = 2 3
c,d = 5 6
我需要做的是交换给定间隔中的节点,因此输出应该是:

1 **5 6** 4 **2 3** 7
如您所见,元素为2和3的节点与元素为5和6的节点交换了位置

输入的其他方式可以如下所示:

N:5

Input: 10 50 40 25 1

a, b: 10 10
c, d: 40 1

Output: 40 25 1 50 10
[ ... p, a ... b, q ... r, c ... d, s ... ]
         ^^^^^^^           ^^^^^^^
这意味着间隔可以以相同的数字开始和结束

编辑:请注意,间隔可以不同,即a、b可以有3个节点,c、d可以有更多或更少的节点,或相同数量的节点

这是我到目前为止所做的。我只取了给定的节点(a、b、c、d)的后继节点和前导节点,但我需要以某种方式交换它们。下面是函数的代码

private static DLL<Integer> intervals(DLL<Integer> list, int a, int b, int c, int d) {


        DLLNode<Integer> temp = lista.getFirst();
        DLLNode<Integer> temp1;
        DLLNode<Integer> temp2;
        DLLNode<Integer> temp3;
        DLLNode<Integer> temp4;
        while(temp != null){
            if(temp.element == a){
                temp1 = temp.pred;
            }
            if(temp.element == b){
                temp2 = temp.succ;
            }
            if(temp.element == c){
                temp3 = temp.pred;
            }
            if(temp.element == d){
                temp4 = temp.succ;
            }
            temp = temp.succ;
        }
        return list;
    }
私有静态DLL间隔(DLL列表、int a、int b、int c、int d){
DLLNode temp=lista.getFirst();
dllnodetemp1;
dllnodetemp2;
dllnodetemp3;
dllnodetemp4;
while(temp!=null){
如果(临时元素==a){
temp1=temp.pred;
}
如果(临时元素==b){
temp2=临时成功;
}
如果(温度元素==c){
temp3=temp.pred;
}
如果(温度元素==d){
temp4=临时成功;
}
温度=成功温度;
}
退货清单;
}

您可以在返回列表之前执行以下操作

DLLNode<Integer> a = temp1.succ;
DLLNode<Integer> b = temp2.pred;
DLLNode<Integer> c = temp3.succ;
DLLNode<Integer> d = temp4.pred;

temp1.succ = temp3.succ;
temp3.pred = temp1;

temp4.succ = a;
a.pred = temp4;

b.succ = c;
c.pred = b;
DLLNode a=temp1.succ;
DLLNode b=temp2.pred;
DLLNode c=temp3.succ;
dllnoded=temp4.pred;
temp1.succ=temp3.succ;
temp3.pred=temp1;
temp4.succ=a;
a、 pred=temp4;
b、 succ=c;
c、 pred=b;

你就快到了!假设列表如下所示:

N:5

Input: 10 50 40 25 1

a, b: 10 10
c, d: 40 1

Output: 40 25 1 50 10
[ ... p, a ... b, q ... r, c ... d, s ... ]
         ^^^^^^^           ^^^^^^^

您已经提取了包含
p、q、r、s
的节点。现在要交换带下划线的区域。使
p=a.pred
将其
succ
指向
c
,反之亦然。同样,将
d
链接到
q
;然后将
r
链接到
a
b
链接到
s
好了,伙计们,我解决了,这是完整的代码,很容易理解

private static DLL<Integer> intervals(DLL<Integer> list, int a, int b, int c, int d) {



        DLLNode<Integer> temp =l ist.getFirst();
        DLL<Integer> tmp2=new DLL<Integer>();
        DLL<Integer> tmp3=new DLL<Integer>();
        DLL<Integer> tmp4=new DLL<Integer>();
        DLL<Integer> newList =new DLL<Integer>();
        while(temp .element!=a)
        {
            nova.insertLast(temp .element);
            temp = temp.succ;
        }
        tmp2.insertLast(temp.element);
        temp =temp.succ;
        while(temp.pred.element!=b)
        {
            tmp2.insertLast(temp.element);
            temp=temp.succ;
        }
        while(temp.element!=c)
        {
            tmp3.insertLast(temp.element);
            pom=pom.succ;
        }
        while(temp!=null&&temp.pred.element!=d)
        {
            tmp4.insertLast(temp.element);
            temp=temp.succ;
        }

        DLLNode<Integer> node2=tmp2.getFirst();
        DLLNode<Integer> node3=tmp3.getFirst();
        DLLNode<Integer> node4=tmp4.getFirst();

        while(node4 != null)
        {
            newList.insertLast(node4.element);
            node4=node4.succ;
        }
        while(node3 != null)
        {
            newList.insertLast(node3.element);
            node3=node3.succ;
        }
        while(node2 != null)
        {
            newList.insertLast(node2.element);
            node2=node2.succ;
        }
        while(pom != null)
        {
            newList.insertLast(pom.element);
            pom=pom.succ;
        }
        list = newList;
        return list;
    }
私有静态DLL间隔(DLL列表、int a、int b、int c、int d){
DLLNode temp=l ist.getFirst();
DLL tmp2=新的DLL();
DLL tmp3=新DLL();
DLL tmp4=新DLL();
DLL newList=newdll();
while(温度元素!=a)
{
新镶片(温度元件);
温度=成功温度;
}
tmp2.insertLast(温度元件);
温度=成功温度;
while(温度前元素!=b)
{
tmp2.insertLast(温度元件);
温度=成功温度;
}
while(温度元件!=c)
{
tmp3.insertLast(温度元件);
pom=pom.succ;
}
while(temp!=null&&temp.pred.element!=d)
{
tmp4.insertLast(温度元件);
温度=成功温度;
}
DLLNode node2=tmp2.getFirst();
DLLNode node3=tmp3.getFirst();
DLLNode node4=tmp4.getFirst();
while(node4!=null)
{
newList.insertLast(node4.element);
node4=node4.succ;
}
while(node3!=null)
{
insertLast(node3.element);
node3=node3.succ;
}
while(node2!=null)
{
newList.insertLast(node2.element);
node2=node2.succ;
}
while(pom!=null)
{
insertLast(pom.element);
pom=pom.succ;
}
列表=新列表;
退货清单;
}

如果
b-a>1
会发生什么?
b-a=d-c
有保证吗?函数应该做什么的解释正确吗?我想你没有很好地理解它。间隔应该包括元素值,而不是位置。是的@Mauris这是正确的我认为我们错过了一个案例。。。如果第一个节点包含元素怎么办?然后temp1=temp.pred将为null…您必须手动处理,或者您可以添加到DLL的两端。