挑战程序设计竞赛(算法和数据结构)——4.4链表习题的Java实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——4.4链表习题的Java实现相关的知识,希望对你有一定的参考价值。

链表有初始化、插入元素、删除元素、查找元素等方法。在创建链表的过程中,最关键的是搞清楚链表的几个关键数据构成:链表由一个个节点互相串联构成,节点作为一个基础的对象,可由类Node(随便取个名字都行)来声明。节点中包含三个值,key(int)用于存储数据值的大小、prev(Node)用作指针指向上一个节点、next(Node)用作指针指向下一个节点。

本文实现的双向链表,在初始化时,头节点nil的prev和next指针均指向自己。而在插入元素时,则比较讲究,可以参考下图:

实现代码如下:
Main.java

public class Main {
    public static void main(String[] args) {
        BidirectionalLinkedList LinkedList = new BidirectionalLinkedList();
        LinkedList.insert(1);//链表添加元素
        LinkedList.insert(3);
        LinkedList.insert(9);
        LinkedList.insert(8);
        LinkedList.insert(4);
        LinkedList.insert(7);
        LinkedList.insert(2);
        LinkedList.show();//实现链表的遍历

//        //实现链表的搜索
//        BidirectionalLinkedList.Node cur = LinkedList.listSearch(2);
//        System.out.println("查找元素为:" + cur.key);

        //实现链表的删除节点
        System.out.println("删除第一个元素...");
        LinkedList.deleteFirst();
        LinkedList.show();

        System.out.println("删除最后一个元素...");
        LinkedList.deleteLast();
        LinkedList.show();

        System.out.println("删除元素9...");
        LinkedList.deleteKey(9);
        LinkedList.show();


    }
}

public class BidirectionalLinkedList {
    class Node{//节点的定义
        int key=Integer.MIN_VALUE;
        Node prev, next;
    }

    Node nil = new Node();

    //链表初始化
    BidirectionalLinkedList(){
        this.nil.next = this.nil;
        this.nil.prev = this.nil;
    }

    //链表的遍历
    public void show(){
        BidirectionalLinkedList.Node head_nil = this.nil;
        System.out.println("链表中的元素为:");
        while(this.nil.next != head_nil){
            System.out.print(this.nil.next.key + " ");
            this.nil = this.nil.next;
        }
        System.out.println("");
        this.nil = head_nil;//遍历完要把头指针指回来
    }

    //插入元素
    public void insert(int key){
        Node x = new Node();
        x.key = key;
        //在头节点后添加元素
        x.next = nil.next;
        nil.next.prev = x;
        nil.next = x;
        x.prev = nil;
    }

    public Node listSearch(int key){
        Node cur = new Node();
        cur = nil.next;//从头节点后面的元素开始访问
        while(cur!=nil && cur.key!=key){
            cur = cur.next;
        }
        return cur;
    }

    public void deleteNode(Node t){
        if(t==nil)return;//t未为头节点时不做处理
        t.prev.next = t.next;
        t.next.prev = t.prev;
    }

    public void deleteFirst(){
        deleteNode(nil.next);
    }

    public void deleteLast(){
        deleteNode(nil.prev);
    }

    public void deleteKey(int key){
        //删除搜索到的节点
        deleteNode(listSearch(key));
    }
}

代码输出结果为:

链表中的元素为:
2 7 4 8 9 3 1 
删除第一个元素...
链表中的元素为:
7 4 8 9 3 1 
删除最后一个元素...
链表中的元素为:
7 4 8 9 3 
删除元素9...
链表中的元素为:
7 4 8 3 

作于:
2021-11-8
14:41

以上是关于挑战程序设计竞赛(算法和数据结构)——4.4链表习题的Java实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现

挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现