题目
提示
对于C/C++,测评程序是一样的,如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
// 其他数据域成员
} NODE;
NODE* distinctSort (NODE*);
int main() {
NODE* head = NULL;
while (/* 读入数据,细节隐藏不表 */) {
NODE* node = (NODE*) malloc (sizeof(NODE));
/* 构建链表 */
}
head = distinctSort (head);
/* 后续判题,细节隐藏不表 */
return 0;
}
/* 你的代码将会被嵌入在这个部分 */
期待大佬的指导。
思路:插入排序+去重
首先,把链表分成有序和无序两个部分,即断开链表
node* newhead=head;
node* p2=newhead->next;
node* p1=newhead;
node *prior1=NULL, *prior2=NULL;
p1->next=NULL;
最后prior2没有用到,注释掉也可以
用p2指针遍历无序列表
while(p2)
{
while(p1 && p1->data<=p2->data)
{
prior1=p1;
p1=p1->next;
}//找到插入位置
if(prior1==NULL){//p2数据插入表头
node* latter=p2->next;
p2->next=newhead;
newhead=p2;
p2=latter;
}
else{
if(p2->data==prior1->data)
{
node* temp=p2;
p2=p2->next;
delete temp;
}
else{
node* latter=p2->next;
prior1->next=p2;
p2->next=p1;
prior1=p2;
p2=latter;
}
}
图解:
找插入位置:
当prior1==NULL时,插入表头:
完整代码:
NODE* distinctSort(NODE* head)
{
if(head==NULL) return head;
//将链表断开.分为有序链表和无序链表
node* newhead=head;
node* p2=newhead->next;
node* p1=newhead;
node *prior1=NULL, *prior2=NULL;
p1->next=NULL;
while(p2)
{
while(p1 && p1->data<=p2->data)
{
prior1=p1;
p1=p1->next;
}
if(prior1==NULL){//p2数据插入表头
node* latter=p2->next;
p2->next=newhead;
newhead=p2;
p2=latter;
}
else{
if(p2->data==prior1->data)
{
node* temp=p2;
p2=p2->next;
delete temp;
}
else{
node* latter=p2->next;
prior1->next=p2;
p2->next=p1;
prior1=p2;
p2=latter;
}
}
p1=newhead;
prior1=NULL;
}
return newhead;
}