10,将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。
思路:隔一个拆一个,拆下来的用尾插法插进去。
注意:因为涉及到p->next->next, 需要判断p->next的空
#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 divorce(LinkList &L, LinkList &L2){
Node *p = L->next;
Node *q = L2;
while(p && p->next){
q->next = p->next;
p->next = p->next->next;
q->next->next = NULL;
p=p->next;
q=q->next;
}
}
// 输出有头结点的单链表
void show(LinkList L){
Node *p = L->next;
while(p){
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
// 头插创建链表
void createListFromHead(vector<int> v, LinkList &L){
// 创建头
L = new Node();
// 生成链表
for(int i=0; i<v.size(); i++){
Node *p = new Node(v.at(i));
p->next = L->next;
L->next = p;
}
}
int main(){
int a[]={1,2,3,4,5,6,7};
vector<int> V(a, a+7);
LinkList L;
createListFromHead(V, L);
show(L);
LinkList L2 = new Node();
divorce(L, L2);
show(L);
show(L2);
return 0;
}