Java数据结构之链表——头插法逆置双链表

定义双链表基本操作

package Link;

class DoubleNode{

    public int value; // 该结点所保存的值
    public DoubleNode next; // da该结点下一个结点指针
    public DoubleNode last; // da该结点上一个结点指针

    public DoubleNode(int data){

        value = data;
        next = null;
        last =null;

    }

    public DoubleNode(){

        next = null;
        last =null;

    }
}

// 定义双链表基本操作
public class DoubleLinkList{

    DoubleNode head = null; // 头结点为空

    // 尾插法创建双链表
    public DoubleNode TailCreateLinkList(int[] arr){

        int len = arr.length;

        if(len == 0){

            System.out.println("创建空链表");

            return head;

        }

        head = new DoubleNode(arr[0]);

        DoubleNode pre = head;

        for(int i = 1;i < len;i++){

            DoubleNode doublenode = new DoubleNode(arr[i]);

            pre.next = doublenode;
            doublenode.last = pre;

            pre = doublenode;

        }

        return head;

    }

    // 头插法创建双链表
    public DoubleNode HeadCreateLinkList(int[] arr){

        int len = arr.length;

        if(len == 0){

            System.out.println("创建空链表");

            return head;

        }

        head = new DoubleNode(arr[0]);

        for(int i = 1;i < len;i++){

            DoubleNode doublenode = new DoubleNode(arr[i]);

            doublenode.next = head;// 在链表头部插入结点

            head.last = doublenode;

            head = doublenode; // 每一个新插入的结点都成为新的头结点

        }

        return head;

    }

    public void PrintDoubleLinkList(DoubleNode head){

        if(head == null){

            System.out.println("链表为空!");
            return;
        }

        DoubleNode pre = head;
        DoubleNode q = new DoubleNode();

        System.out.println();
        System.out.print("顺序输出链表:");

        while (pre != null){

            System.out.print(pre.value + "\t");
            q = pre;
            pre = pre.next;
        }

        System.out.println();
        System.out.print("逆序输出链表:");

        while (q != null){

            System.out.print(q.value + "\t");

            q = q.last;
        }

    }

    public int DoubleLinkLength(Node head){

        int len = 0;

        if(head == null){

            System.out.println("链表为空");
            return 0;
        }

        while(head != null){

            len++;
            head = head.next;
        }

        return len;

    }

    public DoubleNode DoubleLinkListInverse(DoubleNode head){

        if(head == null){

            System.out.println("空链表!");
            return head;
        }

        DoubleNode p = head;
        DoubleNode q = p.next;

        if(q == null){

            System.out.println("链表只有一个值,不用翻转!");
            return head;
        }

        while(q != null){

            p.next = q.next;
            if(q.next != null){

                q.next.last = p;

            }

            q.next = head;
            head.last = q;

            q.last = null;
            head = q;

            q = p.next;

//            PrintDoubleLinkList(head); // 打印链表
//            System.out.println();
        }

//        PrintDoubleLinkList(head); // 打印链表
//        System.out.println();

        return head;
    }

    public DoubleNode DeleteDoubleLinkElements(int a,DoubleNode head){

        if(head == null){

            System.out.println("空链表!");

            return head;
        }

        while(head.value == a){ // 头结点的值等于待删除的值,单独处理

            head = head.next;
            if(head == null){

                return head;

            }
            head.last = null;
        }

        DoubleNode pre = head; // 指向当前结点的前一结点
        DoubleNode q = pre.next;

        while(q != null){

            if(q.value == a){  // 当前结点值恰好为待删除的值,pre指针不用移动,因为删除一个q结点之后会带来一个新的q结点

                pre.next = q.next;
                if(q.next != null){ // q的下一结点为空,则不会有last,要注意了!

                    q.next.last = pre;
                }

                q = pre.next;

            }
            else{ // 当前值不等于待删除值,当前结点指针后移
                pre = pre.next;
                q = pre.next;
            }

        }

        return head;
    }
}

主函数

package Link;

public class DoubleLinkListInverse {

    public static void main(String[] args) {

//        int [] arr = new int[] {1,3,4,7,3,0,8,2};

        int [] arr = new int[] {3,3,3,1,3,4,3,3,3,7,3,0,8,2,3,3,3};

//        int [] arr = new int[] {3,3,3,3,3,3,3,3,3,3,3};

        DoubleLinkList doubleLinkList = new DoubleLinkList();

        System.out.println();
        System.out.println("--------尾插法创建双链表--------");
        System.out.println();

        DoubleNode tail = doubleLinkList.TailCreateLinkList(arr);  // 尾插法
        doubleLinkList.PrintDoubleLinkList(tail);

//        DoubleLinkList doubleLinkList1 = new DoubleLinkList();
//        DoubleNode head = doubleLinkList1.HeadCreateLinkList(arr); // 头插法
//        doubleLinkList1.PrintDoubleLinkList(head);

        System.out.println("--------双链表反转--------");
        System.out.println();
        tail = doubleLinkList.DoubleLinkListInverse(tail);
        doubleLinkList.PrintDoubleLinkList(tail);

        System.out.println();
        System.out.println("--------删除所有给定值--------");

        tail = doubleLinkList.DeleteDoubleLinkElements(3,tail);
        doubleLinkList.PrintDoubleLinkList(tail);


    }
}

输出


--------尾插法创建双链表--------


顺序输出链表:3	3	3	1	3	4	3	3	3	7	3	0	8	2	3	3	3	
逆序输出链表:3	3	3	2	8	0	3	7	3	3	3	4	3	1	3	3	3	--------双链表反转--------


顺序输出链表:3	3	3	2	8	0	3	7	3	3	3	4	3	1	3	3	3	
逆序输出链表:3	3	3	1	3	4	3	3	3	7	3	0	8	2	3	3	3	
--------删除所有给定值--------

顺序输出链表:2	8	0	7	4	1	
逆序输出链表:1	4	7	0	8	2	
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值