王道书P42 T25(单链表实现)

/**
 * 用链表实现 王道P42 T25
 *
 * ①算法思想:
 * 首先将链表的分为从中间封为两端,并将后一段采用断链头插的方式逆置,
 * 现在前一段是有头节点的L 的前半段,后一段是无头结点的L1(也就是 L 的后半段逆置的),
 * 令 p = L -> next,现在 p 拿到了正着的 L 的前半段元素,L1 拿到了逆着的 L 的后半段元素
 * 然后将 p 和 L1 合并插入 L中即可。 
 *
 * ②数据结构:
 *  typedef struct LNode{
        int data;
        struct LNode *next;
    }LNode,*LinkList;
 *
 * ③算法设计
 */


#include <stdio.h>
#include <iostream>

typedef struct LNode{
    int data;
    struct LNode* next;
}LNode,*LinkList;

LinkList CutHalfMerge(LinkList &L,int n){//默认传进长度
    LinkList p = L -> next;
    int count = 0;
    while(count ++ < n / 2){
        p = p-> next;
    }
    //p 指向中间的位置
    LinkList q = p -> next;
    p -> next = NULL;//第一段的最后指向NULL
    LinkList L1 = NULL,r;//断链,然后将后面一段进行头插
    while(q){
        r = q -> next;// r 用来标记 q 的下一个
        //没有头结点的头插
        q -> next = L1;
        L1 = q;
        q = r;
    }
    //下面要将两段合并到L
    count = 1;
    p = L -> next;//p 拿到了正着的 L 的前半段元素,L1 拿到了逆着的 L 的后半段元素(L是有头节点的,L1无头结点,所以为了方便,让 p = L -> next)
    L -> next = NULL;//L 是合并后链表的头节点
    r = L;//r用来L的尾插
    while(p && L1){
        if(count % 2 != 0){
            q = p -> next;//q用来保存p的next
            r -> next = p;
            r = p;
            p = q;
        }else{
            q = L1 -> next;
            r -> next = L1;
            r = L1;
            L1 = q;
        }
        count ++;
    }
    //还剩下一个元素
    while(p){
        q = p -> next;//q用来保存p的next
        r -> next = p;
        r = p;
        p = q;
    }
    while(L1){
        q = L1 -> next;
        r -> next = L1;
        r = L1;
        L1 = q;
    }
    r -> next =NULL;
    return L;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值