当我在我的链表中插入数字时,只有当添加到该链表的第一个数字是最小的时,它才会对所有内容进行排序。这是我所遇到的意外行为:
我按照以下顺序插入数字-200、25、473、23、390。
如果我像上面那样对列表进行排序并显示它,我会得到这个结果——200、390、473。
如果我将200更改为900,然后对列表进行排序,它只会显示900。
只有当我将200更改为列表中最小的数字,比如1(或任何小于23的数字),然后它才会给出正确的输出:1、23、25、390、473。
对于此链接列表,我在列表后面插入元素,这是代码:
我按照以下顺序插入数字-200、25、473、23、390。
如果我像上面那样对列表进行排序并显示它,我会得到这个结果——200、390、473。
如果我将200更改为900,然后对列表进行排序,它只会显示900。
只有当我将200更改为列表中最小的数字,比如1(或任何小于23的数字),然后它才会给出正确的输出:1、23、25、390、473。
对于此链接列表,我在列表后面插入元素,这是代码:
public void insertAtBack(IntegerElement elem) {
if (isFull()) {
System.out.println("Unable to insert node into full list");
} else {
Node temp = new Node(elem);
if (isEmpty()) {
head = temp;
} else {
Node current = head;
while (current.getLink() != null) {
current = current.getLink();
}
current.setLink(temp);
}
}
}
这是我用来进行归并排序的代码:
public Node getMiddle(Node node) {
if (node == null)
return node;
Node fastptr = node.getLink();
Node slowptr = node;
// Move fastptr by two and slow ptr by one
// Finally slowptr will point to middle node
while (fastptr != null) {
fastptr = fastptr.getLink();
if(fastptr != null) {
slowptr = slowptr.getLink();
fastptr = fastptr.getLink();
}
}
return slowptr;
}
public Node merge(Node left, Node right) {
Node tempHead = new Node(), curr;
curr = tempHead;
while(left != null && right != null) {
if(left.getData().getValue() <= right.getData().getValue()) {
curr.setLink(left);
left = left.getLink();
}else {
curr.setLink(right);
right = right.getLink();
}
curr = curr.getLink();
}
curr.setLink((left == null) ? right : left);
return tempHead.getLink();
}
/**
* This method utilizes merge sort algorithm
*
* @param node - Pass in head first
*
*/
public Node sort(Node node) {
// Base case : if head is null
if (node == null || node.getLink() == null)
return node;
// get the middle of the list
Node middle = getMiddle(node);
Node nextofmiddle = middle.getLink();
// set the next of middle node to null
middle.setLink(null);
// Merge the left and right lists
return merge(sort(node), sort(nextofmiddle));
}
非常感谢您的帮助