18,有两个循环单链表,链表头指针分别为h1和h2,编写一个函数将链表h2链接到链表h1之后,要求链接后的链表仍保持循环链表形式。
思路:两个链表都找到最后一个节点,然后再链接
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<stack>
using namespace std;
// 链表节点结构
typedef struct Node{
int data;
struct Node * next;
Node(): next(NULL){};
Node(int data):data(data), next(NULL){};
}Node, *LinkList;
// 输出循环单链表
void show(LinkList L){
Node * p = L->next;
while(p != L){
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
void append(LinkList &La, LinkList Lb){
Node *pa = La->next;
Node *pb = Lb->next;
// 两个链表都找打最后一个节点
while(pa->next != La){
pa = pa->next;
}
while(pb->next != Lb){
pb = pb->next;
}
pa->next = Lb->next;
pb->next = La;
}
// 头插创建链表
void createListFromHead(vector<int> v, LinkList &L){
// 创建头
L = new Node();
L->next = L;
// 生成链表
for(int i=0; i<v.size(); i++){
Node *p = new Node(v.at(i));
p->next = L->next;
L->next = p;
}
}
// 尾插创建链表
void careteListFromEnd(vector<int> v, LinkList &L){
// 创建头
L = new Node();
L->next = L;
// 设置尾指针
Node *p = L;
// 生成链表
for(int i : v){
Node *q = new Node(i);
q->next = p->next;
p->next = q;
p = q;
}
}
int main(){
int a[] = {1,2,3,4,5,6};
vector<int> va(a, a+6);
int b[] = {7,8,9};
vector<int> vb(b, b+3);
LinkList La, Lb;
careteListFromEnd(va, La);
careteListFromEnd(vb, Lb);
append(La, Lb);
show(La);
return 0;
}