设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B和C,其中B表的结点为A表中值小于零的结点,而C表的结点为A中值大于等于零的结点(要求:B、C利用A的结点空间)。
时间: 2024-05-30 11:14:11 浏览: 104
带头结点的单链表的c算法实现
可以使用双指针法,遍历链表A,将小于零的结点插入B表,大于等于零的结点插入C表。代码如下:
ListNode* splitList(ListNode* A) {
ListNode B_dummy(0), C_dummy(0); // 创建B和C的虚拟头结点
ListNode* B = &B_dummy, * C = &C_dummy;
ListNode* curr = A->next; // 从第一个结点开始遍历
while (curr != nullptr) {
if (curr->val < 0) { // 如果当前结点的值小于零
B->next = curr; // 将其插入到B表的末尾
B = B->next;
} else { // 否则将其插入到C表的末尾
C->next = curr;
C = C->next;
}
curr = curr->next; // 遍历到下一个结点
}
B->next = C->next = nullptr; // 清空链表末尾
A->next = B_dummy.next; // 将B表和C表接到原链表A后面
return C_dummy.next;
}
注意使用虚拟头结点可以避免处理头结点的特殊情况。
阅读全文