首页 > 其他分享 >双循环链表 by lyx

双循环链表 by lyx

时间:2023-03-29 12:00:32浏览次数:31  
标签:cur 双循环 lyx DblNode 链表 lLink rLink 节点 first

#include<iostream>

using namespace std;

template<class T>

struct DblNode{

    T data;

    DblNode<T> *lLink,*rLink;

    DblNode(DblNode<T> *l=NULL,DblNode<T> *r=NULL){lLink=l;rLink=r;}

    DblNode(T value,DblNode<T> *l=NULL,DblNode<T> *r=NULL){data=value;lLink=l;rLink=r;}

};

 

template<typename T>

class DblList{

private:

    DblNode<T>* first;//头节点

public:

    DblList(T uniqueval){

        first= new DblNode<T>(uniqueval);

        first->rLink=first;

        first->lLink=first;//左右都指向自己

    }

    DblList(DblList<T>& L){

        DblNode<T> *p=L.first->rLink;

        if(p==NULL)exit(-1);

        first= new DblNode<T>;//给新开的链表定义头节点

        DblNode<T> *h=first;

        while(p!=L.first){

            DblNode<T>* t= new DblNode<T>;//给新链表增加新节点,存放被拷贝的链表的数据

            h->rLink=t;

            t->lLink=h;

            t->data=p->data;//插入

            p=p->rLink;

            h=h->rLink;//向后移动

        }

        h->rLink=first;

        first->lLink=h;//最后一个结点的rLink需要指向头节点,头节点的lLink需要指向最后一个结点,形成双向循环链表

    }

    ~DblList(){

        DblNode<T>* cur=first->rLink;

        while(cur!=first){

            cur->rLink->lLink=cur->lLink;

            cur->lLink->rLink=cur->rLink;//删除

            delete cur;

            cur=first->rLink;

        }

        delete first;

        first=NULL;//头节点也要删除

    }

    void makeEmpty(){//清空链表

        DblNode<T>* cur=first->rLink;

        while(cur!=first){

            cur->rLink->lLink=cur->lLink;

            cur->lLink->rLink=cur->rLink;

            delete cur;

            cur=first->rLink;

        }

        first->rLink=first;//最后只剩头节点

    }

    DblNode<T>* locate(int i,int d){//d为开始搜索的方向,按照方向找第i个节点

        if(first==first->rLink||i==0)return first;

        DblNode<T>* cur;

        if(d==0)cur=first->lLink;

        else cur=first->rLink;//d=0按前驱方向,否则按后继方向

        for(int j=1;j<i;++j){//之前已经先走一步,之后找第i个节点只用走i-1步,因为d不变,方向一定,从而步数一定

            if(cur==first)break;

            else if (d==0)cur=cur->lLink;

            else cur=cur->rLink;

        }

        if(cur!=first)return cur;

        else return NULL;

    }

    bool IsEmpty(){

        return first->rLink==first;

    }

    bool Insert(int i,const T& x,int d){//建立含x值的新节点,将其按照d指定的方向插入第i个节点后

        DblNode<T>* cur=locate(i,d);

        if(cur==NULL)return false;

        DblNode<T> *newNd = new DblNode<T>(x);

        if(d==0){//插入在第i个节点左侧

            newNd->lLink=cur->lLink;//新节点的左边内容是老节点的左边内容

            cur->lLink=newNd;//老节点的左边变成新节点

            newNd->lLink->rLink=newNd;//新节点的左边一个节点的右边内容变为新节点

            newNd->rLink=cur;//新节点右边内容变为老节点

        }

        else{//插入在第i个节点右侧

            newNd->rLink=cur->rLink;//新节点的右边内容是老节点的右边内容

            cur->rLink=newNd;//老节点的右边变成新节点

            newNd->rLink->lLink=newNd;//新节点的右边一个节点的左边内容变为新节点

            newNd->lLink=cur;//新节点左边内容变为老节点

        }

        return true;

    }

    bool Remove(int i,int d){

        DblNode<T>* cur=locate(i,d);

        if(cur==NULL)return false;

        cur->lLink->rLink=cur->rLink;//当前节点的左边节点的右边内容 变为 当前节点的右边内容

        cur->rLink->lLink=cur->lLink;//当前节点的右边节点的左边内容 变为 当前节点的左边内容

        delete cur;//删除已经被孤立的节点

        return true;//删除成功

    }

    void output(int d){//d=0按照前驱方向,否则按照后继方向

        DblNode<int>* cur;

        if(!d)cur=first->lLink;

        else cur=first->rLink;

        while(cur!=first){

            cout<<cur->data<<" ";

            if(!d)cur=cur->lLink;

            else cur=cur->rLink;

        }

        cout<<endl;

    }

};

int main()

{

    DblList<int>L(1);

    L.Insert(0,7,0);

    L.Insert(0,8,0);

    L.Insert(0,9,0);

    L.Insert(1,6,0);

    L.output(0);//逆序

    L.output(1);//正序

    L.makeEmpty();

    cout<<endl;

    L.Insert(0,9,1);

    L.Insert(0,8,1);

    L.Insert(0,7,1);

    L.Insert(0,6,1);

    L.Remove(2,0);

    L.output(0);

    L.output(1);

    int k;

    k=L.locate(3,1)->data;

    cout<<k<<endl;

    DblList<int>L1(L);

    L.output(0);

    L.output(1);

    return 0;

}

输出结果:

9 6 8 7 

7 8 6 9 

 

9 7 6 

6 7 9 

9

9 7 6 

6 7 9

标签:cur,双循环,lyx,DblNode,链表,lLink,rLink,节点,first
From: https://www.cnblogs.com/RainyLLL/p/17268397.html

相关文章

  • 链表的遍历
    练习1:一组整数已存放在带头结点的单链表中,设计算法,求结点值小于结点平均值的结点个数,并通过函数值返回结果。 #include<stdio.h>#include<stdlib.h>typedefstructnode{......
  • 数据结构-->单链表OJ题--->讲解_05
    本期我们讲解:>1.给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前本题的思路是创建两个链表,通过比较,一个存放小于x的结点的链表,另一个存放大于......
  • 数据结构-->单链表OJ题--->讲解_04
    本期我们讲解一道:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表所有结点组成的。现附上图示样例:现在上手代码:>SLTNode*CombineLists(S......
  • 快慢指针-leetcode141-判断链表中是否有环。
    LeetCode#141题目描述:给定一个链表,判断链表中是否有环。如果链表中存在环,则返回true。否则,返回false。进阶:你能用O(1)(即,常量)内存解决此问题吗?示例1:example1......
  • Linux链表
    linux创建及初始化链表动态方法通过structlist_head创建,INIT_LIST_HEAD初始化。(list_head以及INIT_LIST_HEAD位于<linux/list.h>)structlist_head{structlist......
  • 203. 移除链表元素
    c++解法解法1:先确定头节点,而后移动指针/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode()......
  • LeetCode 142.环形链表II
    力扣LeetCode142.环形链表II题目跳转链接解题思路:代码随想录:142.环形链表II从头结点出发一个指针,从相遇节点也出发一个指针,这两个指针每次只走一个节点,那么当这......
  • 数据结构-->单链表OJ题--->讲解_03
    老铁们,现在开讲啦!!下面是本期的OJ试题:>1.给定一个带有头结点head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。现列图式样所示:>上图只有一......
  • 24. 两两交换链表中的节点——学习笔记
    题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输......
  • 206.反转链表——学习笔记
    题目:给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:hea......