晚上好,我有一个问题。我创建了一个Node类:
public class Node {
private int value;
private Node next;
private Node prev;
Node(int value) {
this.value = value;
this.next = null;
}
Node(int value, Node next) {
this.value = value;
this.next = next;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public void printXXX() {
System.out.println("Node : " + this.value);
}
public boolean hasNext() {
if(this.next != null) {
return true;
} else {
return false;
}
}
我有一个任务来打印一个新的Node链,我需要使用一个函数将一个Node链插入到中间某个位置的另一个Node链中。例如Node1[25,28,32,39,60,70]
Node2[43,49,52,58]
,而我想让一个函数返回Node[25,28,32,39,43,49,52,58,60,70]
我在这里显示了一个代码:
public class Main {
public static void createANewChain(Node node1, Node node2) {
boolean flag = false;
while(node1.getNext() != null) {
if(node1.getNext().getValue()>node2.getValue()) {
node1.setNext(node2);
flag = true;
while (node2.getNext() != null) {
node2 = node2.getNext();
}
//node2.setNext(node1.getNext()); //error
}
else
{
node1 = node1.getNext();
}
}
if(flag == false) {
while(node1.getNext() != null) {
node1 = node1.getNext();
}
node1.setNext(node2);
}
}
public static void printANewChain(Node node1) {
while(node1.hasNext()) {
System.out.println(node1.getValue());
node1 = node1.getNext();
}
System.out.println(node1.getValue());
}
public static void main(String[] args) {
Node n6 = new Node(70);
Node n5 = new Node(60,n6);
Node n4 = new Node(39,n5);
Node n3 = new Node(32,n4);
Node n2 = new Node(28,n3);
Node n1 = new Node(25,n2);
Node g4 = new Node(58);
Node g3 = new Node(52,g4);
Node g2 = new Node(49,g3);
Node g1 = new Node(45,g2);
createANewChain(n1,g1);
printANewChain(n1);
}
}
最后,我遇到了无限循环。因此,问题在于,在将第一个节点链接到第二个节点之后,我丢失了链接Node2
Node1[25,28,32,39]
... [60,70]
-我输了
在任务中,Node2
中的所有数字都应位于Node1
中两个特定数字之间的倒抽中
请帮助我找到有关如何链接其中两个节点的解决方案。我希望我能清楚地解释任务。 祝您有美好的一天,并感谢您的解决方案。
答案 0 :(得分:1)
比这简单。但是首先,您的函数定义不正确。您需要指定要附加到哪个节点以及要插入哪个节点,例如
void greyScale( unsigned char * src , int rows, int cols){
for( int i = 0; i < rows; i++){
for( int j = 0; j < cols; j++){
char r = src[3 * (i * cols + j)];
char g = src[3 * (i * cols + j) + 1];
char b = src[3 * (i * cols + j) + 2];
char linearIntensity = (char)(0.2126f * r + 0.7512f * g + 0);
src[3 * (i * cols + j)] = linearIntensity;
src[3 * (i * cols + j) + 1] = linearIntensity;
src[3 * (i * cols + j) + 2] = linearIntensity;
}
}
}
然后,您需要做的是
将nodeToAppendTo上一个值(nodeToAppend.next.prev)之后的节点设置为nodeToInsert的最后一个元素,反之亦然(nodeToInsert上一个元素。next = nodeToAppendTo之后的节点,并同样设置nodeToAppendTo的最后一个元素)
然后将nodeToAppendTo.next设置为nodeToInsert,将nodeToInsert.previous设置为nodeToAppendTo
这是将一个链接列表插入另一个列表的方式。
由于我认为这是一个家庭作业问题,因此我将其留给您进行伪编码
答案 1 :(得分:0)
谢谢您的回答,我自己就解决了这个问题,无论算法是好还是坏。
public static void createANewChain(Node node1, Node node2) {
boolean flag = false;
while(node1.getNext() != null) {
if(node1.getNext().getValue()>node2.getValue()) {
Node copy = node2;
while (copy.getNext() != null) {
copy = copy.getNext();
}
copy.setNext(node1.getNext());
node1.setNext(node2);
flag = true;
while (node2.getNext() != null) {
node2 = node2.getNext();
}
}
else
{
node1 = node1.getNext();
}
}
if(flag == false) {
while(node1.getNext() != null) {
node1 = node1.getNext();
}
node1.setNext(node2);
}
}