我有一个链表,我必须确保无论列表的最大数量是什么,我都把它放在链表的末尾。我不确定我做错了什么。有人可以解释一下吗?
void moveAllMaxAtEnd(list A) {
int max=0;
link tmp=A->first;
link curr=tmp->next;
int i,count=0;
while(curr!=NULL){ //This first while is where I find the max item
if(curr->item>=max){
max=curr->item;
count++;
}
else{
curr=curr->next;
}
}
link prev=A->first;
link curr1=prev->next;
link tmp1;
while(curr1->next!=NULL){ //In this loop I am trying to put the
if(curr1->item==max){ //max items at the end.
prev->next=curr1->next;
tmp1=prev->next;
prev->next=curr1->next;
curr1->next=tmp1;
}
else{
prev=prev->next;
curr1=curr1->next;
}
}
}
答案 0 :(得分:0)
虽然我还没有对它进行过测试,但这应该可行。如果是它的作业,请今天不要阅读答案(从自己身上学习会对你有所帮助!)。
对列表元素进行一点绘制并查看链接行为。您将立即看到此方法的问题。
我的绘图示例
更正(不要立即阅读)
var peoples = [
{ "attr1": "bob", "attr2": "pizza" },
{ "attr1": "john", "attr2": "sushi" },
{ "attr1": "larry", "attr2": "hummus" }
];
var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");
console.log("index of 'john': " + index);
var index = peoples.map((o) => o.attr1).indexOf("larry");
console.log("index of 'larry': " + index);
var index = peoples.map(function(o) { return o.attr1; }).indexOf("fred");
console.log("index of 'fred': " + index);
var index = peoples.map((o) => o.attr2).indexOf("pizza");
console.log("index of 'pizza' in 'attr2': " + index);
答案 1 :(得分:0)
问题(1)
link tmp=A->first;
link curr=tmp->next;
int i,count=0;
while(curr!=NULL){ //This first while is where I find the max item
if(curr->item>=max){
max=curr->item;
排除第一个元素。 (如果第一个元素是假人,没问题。)
问题(2)
prev->next=curr1->next;//curr1 cut off
tmp1=prev->next;
prev->next=curr1->next;//Processing is a duplicate. meaningless.
curr1->next=tmp1;//==> curr1->next= prev->next ==> curr1->next= curr1->next;meaningless.
不存在具体流程。
修复如下: (注意:第一个元素是处理,如果它不是虚拟的。改变很容易)
void moveAllMaxAtEnd(list A){
if(!A || !A->first || !A->first->next)
return;
link prev = A->first;
link curr = prev->next;
int max = prev->item;
while(curr != NULL){//This first while is where I find the max item
if(curr->item >= max){
max = curr->item;
}
prev = curr;
curr = curr->next;
}
link last = prev;
prev = NULL;
curr = A->first;
link max_list = NULL;
while(curr->next != NULL){
if(curr->item == max){
link cut = curr;
curr = curr->next;
if(prev){
prev->next = cut->next;
} else {
A->first = cut->next;
}
cut->next = max_list;
max_list = cut;
} else {
prev = curr;
curr = curr->next;
}
}
last->next = max_list;
}