Java语言实现单链表和双链表

本文介绍了如何使用Java实现单向链表、双向链表和循环双链表。首先,定义了Node类,包含数据元素和指针。接着,详细阐述了单向链表的添加、删除和查找元素的实现。然后,扩展到双向链表,增加了指向前一个节点的指针,并实现了相应的操作。最后,通过修改双向链表,构建了循环双链表,确保链表的循环性。文章强调了在不同链表结构中维护节点指针的重要性。
摘要由CSDN通过智能技术生成

目录

Node类的定义

单向链表的实现

测试单向链表

双向链表的实现

循环双链表的实现

总结


先来讲一下单向链表,单向链表是一种常用的数据结构,它由一个个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。在Java中,可以通过定义一个Node类来实现单向链表。

Node类的定义

首先,我们需要定义一个Node类,它包含一个数据元素和一个指向下一个节点的指针。代码如下:

class Node {
    int data;
    Node next;

    public Node(int data) {
        this.data = data;
        next = null;
    }
}

单向链表的实现

接下来,我们可以定义一个LinkedList类,它包含一个指向链表头部的指针和一些操作方法,如添加元素、删除元素、查找元素等。具体实现如下:

class LinkedList {
    Node head;

    // 添加元素
    public void add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }

    // 删除元素
    public void remove(int data) {
        if (head == null) {
            return;
        }
        if (head.data == data) {
            head = head.next;
            return;
        }
        Node current = head;
        while (current.next != null) {
            if (current.next.data == data) {
                current.next = current.next.next;
                return;
            }
            current = current.next;
        }
    }

    // 查找元素
    public boolean contains(int data) {
        Node current = head;
        while (current != null) {
            if (current.data == data) {
                return true;
            }
            current = current.next;
        }
        return false;
    }

    // 输出链表
    public void printList() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
    }
}

测试单向链表

最后,我们可以在main方法中测试单向链表的各个操作方法:

public static void main(String[] args) {
    LinkedList list = new LinkedList();
    list.add(1);
    list.add(2);
    list.add(3);
    list.printList(); // 输出:1 2 3
    list.remove(2);
    list.printList(); // 输出:1 3
    System.out.println(list.contains(1)); // 输出:true
    System.out.println(list.contains(2)); // 输出:false
}

双向链表的实现

要将单向链表修改为双向链表,需要在Node类中添加一个指向前一个节点的指针。具体代码如下:

class Node {
    int data;
    Node next;
    Node prev; // 新增

    public Node(int data) {
        this.data = data;
        next = null;
        prev = null; // 新增
    }
}

 然后,在LinkedList类中也需要对一些操作方法进行修改,以保证每个节点都有一个指向前一个节点的指针。具体代码如下:

class LinkedList {
    Node head;
    Node tail; // 新增

    // 添加元素
    public void add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
            tail = newNode; // 新增
        } else {
            tail.next = newNode;
            newNode.prev = tail;
            tail = newNode;
        }
    }

    // 删除元素
    public void remove(int data) {
        if (head == null) {
            return;
        }
        if (head.data == data) {
            head = head.next;
            head.prev = null; // 新增
            return;
        }
        Node current = head;
        while (current.next != null) {
            if (current.next.data == data) {
                current.next = current.next.next;
                if (current.next != null) { // 新增
                    current.next.prev = current;
                } else {
                    tail = current; // 新增
                }
                return;
            }
            current = current.next;
        }
    }

    // 查找元素
    public boolean contains(int data) {
        Node current = head;
        while (current != null) {
            if (current.data == data) {
                return true;
            }
            current = current.next;
        }
        return false;
    }

    // 输出链表
    public void printList() {
        Node current = head;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
    }
}

需要注意的是,在双向链表中,添加和删除元素时都需要修改前一个节点和后一个节点的指针,以保证链表的完整性。同时,我们还新增了一个指向链表尾部的指针tail,以方便双向链表的操作。

循环双链表的实现

要将双向链表修改为循环双向链表,需要在Node类中让prev指针指向尾节点,具体代码如下:

class Node {
    int data;
    Node next;
    Node prev;

    public Node(int data) {
        this.data = data;
        next = null;
        prev = null;
    }
}

然后,在LinkedList类中对一些操作方法进行修改,使其符合循环双向链表的要求。具体代码如下: 

class LinkedList {
    Node head;
    Node tail;

    // 添加元素
    public void add(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
            tail = newNode;
            head.prev = tail;
            tail.next = head;
        } else {
            tail.next = newNode;
            newNode.prev = tail;
            tail = newNode;
            tail.next = head;
            head.prev = tail;
        }
    }

    // 删除元素
    public void remove(int data) {
        if (head == null) {
            return;
        }
        if (head.data == data) {
            head = head.next;
            head.prev = tail;
            tail.next = head;
            return;
        }
        Node current = head;
        while (current.next != head) {
            if (current.next.data == data) {
                current.next = current.next.next;
                current.next.prev = current;
                return;
            }
            current = current.next;
        }
    }

    // 查找元素
    public boolean contains(int data) {
        Node current = head;
        while (current != tail) {
            if (current.data == data) {
                return true;
            }
            current = current.next;
        }
        if (current.data == data) {
            return true;
        }
        return false;
    }

    // 输出链表
    public void printList() {
        Node current = head;
        while (current != tail) {
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.print(tail.data + " ");
    }
}

需要注意的是,在循环双向链表中,添加和删除元素时都需要修改前一个节点和后一个节点的指针以及头尾节点的指针,以保证链表的完整性和循环性。同时,我们还需要将查找元素的范围扩大到tail节点。

总结

以上就是Java语言实现单向链表、双向链表和循环双链表的方法,这些都是非常常用的数据结构,在实际开发中也经常用到。如果读者对单向链表的实现还有疑问,可以随时向我提问。另外,如果您对其他Java相关的问题也需要帮助,我也会尽力为您解答。

谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Richard Du

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值