反转链表(c++实现)

反转链表(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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值