単一チェーンテーブルの重複したノードを再帰的に削除します.
最近、面白いアルゴリズムの問題を聞かれました.再帰的な方法で、シングルチェーンテーブルに記憶されている重複データを削除して、初めて現れたデータの場所の結点だけを残します.チェーンに格納されているデータは1 9 9 8 8で、残りは1 9 8です.以下は具体的に実現されます.
//
// SingleLinkRecurse.c
//
//
// Created by yanbinbin.
//
#include
#include
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
void createList(LNode *node, int len){
int i;
int val;
LNode *tmp, *p;
printf("input current node's val: ");
scanf("%d", &val);
node->data = val;
node->next = NULL;
p = node;
for (i = 0; i < len-1; ++i) {
tmp = (LNode *)malloc(sizeof(LNode));
printf("input current node's val: ");
scanf("%d", &val);
tmp->data = val;
tmp->next = NULL;
p->next = tmp;
p = p->next;
}
}
LNode *recurseLNode(LNode *node, int len){
if(len == 1)
return node;
else{
LNode *tmp = node;
while(tmp != NULL){
while(tmp->next != NULL && tmp->next->data == node->data){
tmp->next = tmp->next->next;
--len;
}
tmp = tmp->next;
}
if(len > 1)
return recurseLNode(node->next, len-1);
else
return recurseLNode(node, len);
}
}
void printLNode(LNode *node){
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
int main(){
LNode node, *pnode=&node, *tmp;
int len = 6;
int i;
int val;
createList(pnode, len);
printLNode(pnode);
putchar('
');
recurseLNode(pnode, len);
printLNode(pnode);
putchar('
');
return 0;
}