三郎数据结构学习笔记:双向循环链表(判断是否对称)附源码

双向循环链表

题目

建立一个带头结点的双向循环链表,
赋值,判断是否对称,写出算法计算时间复杂度

思想

travel the Link ;遍历链表
put values into a array ;赋值给一个数组
compare the array to know whether it belong to symmetry 比较数组是否对称
采用问题转化的思想
将链表问题转换成数组问题,大大降低了思考难度
时间复杂度O(n^2)
因为有两个for循环

实验结果

比较次数本来可以更少点,但是我就不改了分个数奇数偶数
链表数值:1 2 3 2 1
《三郎数据结构学习笔记:双向循环链表(判断是否对称)附源码》
链表数值:1 2 3 2 3
《三郎数据结构学习笔记:双向循环链表(判断是否对称)附源码》

完整源代码

/*
 * Author:sanlang
 * time:2020.11.5
 * function:建立一个带头结点的双向循环链表,赋值,判断是否对称,写出算法计算时间复杂度
 *  my view:travel the Link ;put values into a array ;compare the array to know whether symmetry
 * */
public class DoubleLinkSys {
    public static void main(String[] args) {
        DoubleLink<Integer> doubleLink = new DoubleLink<>();
        doubleLink.initlist();
        doubleLink.add(1);
        doubleLink.add(2);
        doubleLink.add(3);
        doubleLink.add(2);
        doubleLink.add(1);
        doubleLink.print();
        int array[]=new int[5];  //5是长度,不是最大下标 ,下标范围0-4
        for( int i=0; i<5 ;i++){
            array[i]=doubleLink.get(i);
            System.out.println(array[i]);
        }
        System.out.println("判断是否对称开始:");
        for(int m=0;m<4;m++){
            if (array[m]==array[4-m]){
                System.out.println("匹配");
            }
            else
                System.out.println("不匹配");
        }

    }
}
class Node<Anytype> {
    public Anytype data;//数据
    public Node<Anytype> prev;//前一个节点
    public Node<Anytype> next;//后一个节点
    public Node(Anytype data,Node<Anytype> prev,Node<Anytype> next){
        this.data=data;
        this.prev=prev;
        this.next=next;
    }
}



class DoubleLink<AnyType> {
    Node<AnyType> head;//头指针
    Node<AnyType> end;//尾节点
    int size;//记录链表长度

    //初始化链表
    public void initlist(){
        end=new Node<>(null,null,null);
        head=new Node<>(null,null,end);
        end.prev=head;
        end.next=head;
        size=0;
    }

    //获取长度
    public int length(){

        return size;

    }

    //获取节点
    public Node<AnyType> getNode(int index){
        Node<AnyType> n;
        if(index>=size/2){
            n=end;
            for(int i=length();i>index;i--){
                n=n.prev;
            }
            return n;
        }
        else{
            n=head;
            for(int i=0;i<=index;i++){
                n=n.next;
            }
            return n;
        }
    }

    //添加元素
    public void add(AnyType a){
        Node<AnyType> renode=new Node<>(a,getNode(size-1),end);
        renode.prev.next=renode;
        renode.next.prev=renode;
        size++;
    }

    //插入元素
    public void insert(int i,AnyType a){
        Node<AnyType> n=getNode(i);
        Node<AnyType> renode=new Node<>(a,n.prev,n);
        n.prev.next=renode;
        n.prev=renode;
        size++;
    }

    //删除元素
    public AnyType remove(int i){
        Node<AnyType> n=getNode(i);
        AnyType data=n.data;
        n.prev.next=n.next;
        n.next.prev=n.prev;
        size--;
        return data;
    }

    //获取i位置的数据
    public AnyType get(int i){
        return getNode(i).data;
    }

    //为i位置元素重新赋值
    public AnyType set(int i,AnyType a){
        Node<AnyType> n=getNode(i);
        AnyType old=n.data;
        n.data=a;
        return old;

    }

    //清空链表
    public void clear(){
        initlist();
    }



    public void print(){
        for(int i=0;i<size;i++){
            System.out.println(getNode(i).data);
        }
    }
}

    原文作者:三郎君
    原文地址: https://blog.csdn.net/m0_51684972/article/details/109519419
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞