Linklist headinsert(Linklist &L){
L = new LNode();
LNode * s;//要插入的结点
int x;//要插入的值
std::cin >> x;
while (x != -1){
s = new LNode();
s->data = x;
s->next = L->next;
L->next = s;
std::cin >> x;
}
return L;
}
Linklist tailinsert(Linklist &L){
L = (Linklist)malloc (sizeof(LNode));
LNode *s;
int x;
LNode * r = L;//尾结点
std::cin >> x;
while(x != -1){
s = (Linklist)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
std::cin >> x;
}
r->next = NULL;
return L;
}
思路:头插法自带逆序buff,将头结点之后的元素依次头插在头结点之后即可
void reverse(Linklist &L){
LNode *p = L->next;
LNode *s;//头插防断链
L->next = NULL;// L:o , p:o->o->o->o->o//象形文字,将以p为第一个结点的链表头插在L后面
while(p != NULL){
s = p->next;
p->next = L->next;
L->next = p;
p = s;
}
return ;
}
bool del(Linklist &L,int s,int t){
if(L->next == NULL)
return false;
if(s > t)
return false;
LNode *p = L->next;
LNode *r = L;
while(p != NULL){
if(p->data>=s && p->data<=t){
r->next = p->next;//注意以下三行代码
free(p);
p = r->next;
}
p = p->next;
r = r->next;
}
return true;
}
思路:让长度短的链表先移动k个位置,k为长度差,再两个结点同时移动;
int length(Linklist &L){
int count = 0;
LNode* p = L->next;
while(p != NULL){
p = p->next;
count ++;
}
return count;
}
Linklist same_Node(Linklist &l1,LinkList &l2){
LNode *p = l1->next;
LNode *q = l2->next;
int k = length(l1) - length(l2);
if(k >= 0){//l1长,则l2先移k个位置
while(--k != 0)
q = q->next;
}
else{
while(++k != 0)
p = p->next;
}
while(p!=NULL && q!=NULL){
if(p == q)
return p;
p = p->next;
q = q->next;
}
return NULL;
}
void divide(Linklist &A){
LNode *p = A->next;//p指向原表第一个结点
LNode *q = p->next;//q指向原表第二个结点
Linklist B = (LNode*)malloc(sizeof(LNode));//头结点
B->next = NULL;
LNode *r = B;//链表B的尾指针
while(q != NULL){
p = q->next;
q->next = r->next;
r->next = q;
r = q;
q = p->next;
}//尾插
return ;
}
大师兄方法:p保存原表第一个结点后,原表置空,奇数结点尾插到A,偶数结点尾插到B。
void divide(Linklist &A){
Linklist B = (Linklist)malloc(sizeof(LNode*));
LNode *p = A->next;//p指向原表第一个结点
LNode *ra = A;
LNode *rb = B;
A->next = NULL;//原表置空(p已经保存了原表的链接)
int i = 0;//记录原表中结点的序号
while (p != NULL){
i++;
if(i % 2 == 0){//偶结点尾插到B
rb->next = p;
rb = p;
}
else {
ra->next = p;
ra = p;
}
p = p->next;//在这里p就重置到下一个结点了
}//while end
ra->next = NULL;
rb->next = NULL;
}