/**
* 用链表实现 王道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;
}
王道书P42 T25(单链表实现)
于 2022-07-12 17:13:10 首次发布