设C = {a1,b1,a2,b2......,an,bn},采用头结点的hc单链表来存放, 设计一个就地算法,将其拆成 A = {a1,a2....a2} B = {bn,bn-1,...b1}


/*
设C = {a1,b1,a2,b2......,an,bn},采用头结点的hc单链表来存放,
设计一个就地算法,将其拆成
A = {a1,a2....a2}   B = {bn,bn-1,...b1}

很容易联想到头插法
*/
LinkList DisCreat_2(LinkList &A)
{
    LinkList B = (LinkList)malloc(sizeof(NODE));

    B->next = NULL;
    LinkList p = A->next,q;//p为工作指针
    LinkList ra = A;
    while(p)
    {
        ra->next = p;
        ra = p;
        p = p->next;

        q = p->next;//q是为了防止断链
        p->next = B->next;
        B->next = p;

        p = q;//还原
    }
    ra->next = NULL;

    return B;
}

 

为了合并两个循环单链表 `ha` 和 `hb`,我们可以创建一个新的链表 `hc` 并维护两个指针 `p` 和 `q` 分别指向 `ha` 和 `hb` 的头节点。当一个链表遍历完时,我们将另一个链表剩余部分接到 `hc` 的尾部。 以下是C语言的实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; // 创建循环链表的新节点 Node* createLoopList(int arr[], int n) { Node* head = (Node*)malloc(sizeof(Node)); head->data = arr[0]; head->next = head; // 置头节点的下一个节点为自身形成循环 for (int i = 1; i < n; i++) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = arr[i]; newNode->next = head->next; head->next = newNode; } return head; } // 合并两个循环链表 Node* mergeCircularLists(Node* ha, Node* hb) { Node* hc = createLoopList(NULL, 0); // 初始化结果链表 Node* p = ha; Node* q = hb; while (1) { if (p == NULL) { q = q->next; } else if (q == NULL) { p = p->next; } else if (p->next == p) { p = ha; // 如果 ha 或者hb 到了尾部,切换到另一个链表继续 } else if (q->next == q) { q = hb; } else { // 将一个链表的当前节点插入另一个链表之后 Node* temp = p->next; p->next = q->next; q->next = temp; } } return hc; } int main() { int a[] = {1, 2, 3}; int b[] = {4, 5, 6}; Node* ha = createLoopList(a, sizeof(a)/sizeof(a[0])); Node* hb = createLoopList(b, sizeof(b)/sizeof(b[0])); Node* hc = mergeCircularLists(ha, hb); // 输出或进一步处理hc... return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值