我尝试按正数开头和负数结尾时对链表进行排序,但我想保留原始顺序
例如,我输入:3,1,4,6,7,8。
这就是我想要的:4,6,8,3,1,7。
但这就是我得到的:4,6,8,7,1,3
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int number;
struct node *nextPtr;
} node;
node* insert(node* head, int num) {
node *temp, *prev, *next;
temp = (node*)malloc(sizeof(node));
temp->number = num;
temp->nextPtr = NULL;
if (!head){
head = temp;
}
else{
prev = NULL;
next = head;
while (next && next->number % 2 == 0){
prev = next;
next = next->nextPtr;
}
if (!next){
prev->nextPtr = temp;
}
else{
if (prev) {
temp->nextPtr = prev->nextPtr;
prev->nextPtr = temp;
}
else {
temp->nextPtr = head;
head = temp;
}
}
return head;
}
}
void free_list(node *head) {
node *prev = head;
node *cur = head;
while (cur) {
prev = cur;
cur = prev->nextPtr;
free(prev);
}
}
int main(){
node *head, *p;
head = NULL;
head = insert(head, 3);
head = insert(head, 1);
head = insert(head, 4);
head = insert(head, 6);
head = insert(head, 7);
head = insert(head, 8);
p = head;
while (p) {
printf("%d ", p->number);
p = p->nextPtr;
}
free_list(head);
return 0;
}
最佳答案
问题
列表中最后一个偶数之后将插入任何奇数。
这实际上意味着,奇数子列表按相反的顺序出现。
补救
调整insert
如下:
后
while (next && next->number % 2 == 0){
prev = next;
next = next->nextPtr;
}
加
if ( num % 2 == 1 ) {
while (next){
prev = next;
next = next->nextPtr;
}
}
改善
为了提高效率和代码可维护性,甚至更好的办法是保留两个
last
子列表指针或2个链接列表,而不是放在首位。一旦两个子列表都至少有一个条目,您始终可以通过简单地链接各部分来创建一个综合列表。警告
这可能不是OP想要的。她的问题模棱两可,可能使用了错误的用语。
关于c - 正数优先时对链表进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34039340/