链表节点按条件迁移:splitList函数实现求助
链表拆分函数
splitList实现求助 我被这个问题卡了好几天,急需帮忙实现splitList函数。这个函数的功能是:把原链表中满足条件的节点移除并迁移到新链表,仅当当前节点的前一个节点和后一个节点都小于它时才进行迁移。
注意事项
- 若第一个节点被移除,原链表的头指针需要更新
- 第一个节点大于下一个节点时,将其移除并迁移至新链表
- 最后一个节点大于前一个节点时,将其移除并迁移至新链表
- 原链表仅有一个节点时,直接将其移除并迁移至新链表
- 原链表可以是空链表
示例
原链表:3->6->1->9->8->4->5
迁移后的新链表:6->9->5
删除后的原链表:3->1->8->4
已实现的辅助函数
我已经写好几个必须用到的辅助函数,代码如下:
int deleteFirst(list **lst) // 不需要使用返回值,但链表为空时必须返回0,否则返回1 { // 实现代码: list *delNode = *lst; if (delNode == NULL) { printf("List is empty...\n"); return 0; } else { *lst = (*lst)->next; delNode->next = NULL; } return 1; } int deleteAfter(list *curr) // 同样不需要使用返回值,但curr为空或指向最后一个节点时返回0,否则返回1 { // 实现代码: if (curr == NULL) { return 0; } else { list *delItem = curr->next; curr->next = delItem->next; delItem->next = NULL; } return 1; } void freeList(list **lst) { // 实现代码: while (*lst) { deleteFirst(lst); } }
我的问题与当前代码
现在我卡在splitList函数的实现上,尝试用prev和curr两个指针,但处理不好节点迁移后的链表连接问题。会不会不需要真正删除节点,直接做迁移就行?我目前写的splitList代码如下:
int splitList(list **lst, list **new) { // 实现代码: int counter = 0; list *prev, *curr, *currNew; // 原链表为空的情况 if (*lst == NULL) { printf("Original list is empty...\n"); return counter; } prev = NULL; curr = *lst; while (curr->next != NULL) { if (prev == NULL && curr->data > curr->next->data) // 第一个元素大于下一个元素的情况 { deleteFirst(lst); if (*new == NULL) // 新链表为空的情况 { *new = curr; } else { currNew = *new; while (currNew->next != NULL) { currNew = currNew->next; } currNew->next = curr; } } } }
内容的提问来源于stack exchange,提问作者ezra
相关产品推荐
相关产品推荐

