设带头结点单链表存放整数。编写函数split,将链表l分为两个单链表,一个存放所有的非负整数,另一个存放所有的负整数。要求利用原来的结点,不分配新的结点空间,头结点除外。
时间: 2023-03-19 20:29:11 浏览: 128
可以先创建两个新的链表,一个存放非负整数,一个存放负整数。然后遍历原链表,将每个结点根据其值的正负情况插入到对应的新链表中。最后将原链表的头结点指向非负整数链表的头结点,非负整数链表的尾结点指向负整数链表的头结点,负整数链表的尾结点指向空即可。
具体实现可以参考以下代码:
void split(LinkList &l) {
LinkList p = l->next; // p指向第一个结点
LinkList nonNegative = new LNode; // 创建非负整数链表
LinkList negative = new LNode; // 创建负整数链表
LinkList nonNegativeTail = nonNegative; // 非负整数链表的尾结点
LinkList negativeTail = negative; // 负整数链表的尾结点
while (p != NULL) {
if (p->data >= ) { // 如果是非负整数,插入到非负整数链表中
nonNegativeTail->next = p;
nonNegativeTail = p;
} else { // 如果是负整数,插入到负整数链表中
negativeTail->next = p;
negativeTail = p;
}
p = p->next;
}
nonNegativeTail->next = negative->next; // 非负整数链表的尾结点指向负整数链表的头结点
negativeTail->next = NULL; // 负整数链表的尾结点指向空
l->next = nonNegative->next; // 原链表的头结点指向非负整数链表的头结点
delete nonNegative; // 释放非负整数链表的头结点
delete negative; // 释放负整数链表的头结点
}
阅读全文