4、将一个单链表{a1,b1,a2,b2……an,bn}拆分成{a1.a2…an}和{bn.bn-1.……b1}
根据题目要求,我们需要将一个单链表拆分成两个子链表,一个包含原链表的前半部分,另一个包含后半部分。下面是实现这个功能的步骤和代码:
第一步:初始化链表和辅助指针
根据题目中的“将一个单链表拆分成两个子链表”,我们需要:
- 创建一个新的链表头节点
B
。 - 初始化
B
的next
指针为NULL
。 - 使用三个指针
ra
,p
,q
来遍历和操作链表。
这部分的代码为:
LNode *B = new LNode; // 创建新链表的头节点
B->next = NULL; // 初始化新链表的头节点的next为NULLLNode *ra = A, *p = A->next, *q; // 初始化遍历指针
第二步:遍历链表并拆分
根据题目中的“遍历链表,找到中间位置,拆分成两个链表”,我们需要:
- 使用
while
循环遍历链表。 - 使用
ra
作为慢指针,每次移动一步。 - 使用
p
和q
作为快指针,每次移动两步。 - 当
q
到达链表末尾时,ra
将位于链表的中间位置。
这部分的代码为:
A->next = NULL; // 断开原链表的连接
while (p != NULL) { // 遍历链表直到末尾ra->next = p; // 将慢指针的next指向快指针ra = p; // 慢指针前移p = p->next; // 快指针前移两步q = p; // q用于跟踪p的位置if (q == NULL) // 如果q到达末尾,跳出循环break;p = p->next; // 快指针继续前移q->next = B->next; // 将q的next指向新链表的头节点B->next = q; // 新链表的尾节点指向q
}
第三步:断开链表连接并返回新链表
根据题目中的“断开链表连接,返回新链表的头节点”,我们需要:
- 将
ra->next
设置为NULL
,断开原链表的连接。 - 返回新链表的头节点
B
。
这部分的代码为:
ra->next = NULL; // 断开原链表的连接
return B; // 返回新链表的头节点
完整代码
Linklist create(LNode *&A) {LNode *B = new LNode; // 创建新链表的头节点B->next = NULL; // 初始化新链表的头节点的next为NULLLNode *ra = A, *p = A->next, *q; // 初始化遍历指针A->next = NULL; // 断开原链表的连接while (p != NULL) { // 遍历链表直到末尾ra->next = p; // 将慢指针的next指向快指针ra = p; // 慢指针前移p = p->next; // 快指针前移两步q = p; // q用于跟踪p的位置if (q == NULL) // 如果q到达末尾,跳出循环break;p = p->next; // 快指针继续前移q->next = B->next; // 将q的next指向新链表的头节点B->next = q; // 新链表的尾节点指向q}ra->next = NULL; // 断开原链表的连接return B; // 返回新链表的头节点
}