反转链表(c++实现)
节点描述
template <class T>
class ListNode{
//将节点内的元素设为私有,与外界隔离
private:
T data;
ListNode<T> *next;
//定义链表类可以访问私有变量
friend class List<T>;
};
链表类(内部函数省略)
template <class T>
class List{
private:
int Length; //链表长度
ListNode<T> *Head;//头节点
ListNode<T> *Tail;//尾节点
};
反转链表函数
反转链表-1
1、首先若链表为空或只有一个元素,不需要反转,否则到2
2、定义三个指针p,q,r,p=Head它们的关系为p->q->r
3、令q->p,若r为尾节点,则令r->q,Head=nullptr,交换Head与Tail后结束
4、否则令p=q,q=r,r=r->next返回3
例 Head->a->b->Tail
Head<-a->b->Tail
Head<-a<-b->Tail 尾节点指针反转:Head<-a<-b<-Tail 交换头尾节点:Tail<-a<-b<-Head
void resList(){
if(empty()||Head->next->next==Tail){
return;
}
ListNode<T> *p, *q, *r;
p = Head;
q = p->next;
r = q->next;
while(true){
q->next = p;
if(r->next==nullptr){
r->next = q;
Head->next = nullptr;
ListNode<T> *temp = Head;
Head = Tail;
Tail = temp;
return;
}
else
{
p = q;
q = r;
r = r->next;
}
}
return;
}
反转链表——1:后面节点插到前面
1、首先若链表为空或只有一个元素,不需要反转,否则到2
2、定义三个指针p,q,r,p->q->r其中p始终指向初始链表的起始元素
3、将q从p,r之间拿出插入到Head后面,若r是尾节点,结束
4、否则p不变,q=p->next,r=q->next,组成p->q->r后,回到3
void resList_ins(){
if(empty()||Head->next->next==Tail){
return;
}
ListNode<T> *p, *q,*r;
p = Head->next;
q = p->next;
r = q->next;
while(true){
p->next = r;
q->next = Head->next;
Head->next = q;
if(r->next==nullptr){
return;
}
else{
q = p->next;
r = q->next;
}
}
return;
}