java实现双链表及基本方法

(用来做笔记,欢迎交流讨论!)

程序包含以下几个方法:

1.public void add(T data, int i) //在第i个位置处插入节点

2.public void remove(int i) //删除第i个位置处的节点

3.public void removeData(T data) //删除值为data的第一个节点

4.public void length() //如果没有size,求表长

5. public void searchIndex(int i) //按序号(第几个位置)查找节点

6. public void searchData(T data) //按data查找节点

7.public void print() //遍历打印

贴上代码:

package com.fei.example.lib;

public class DLinkedList<T> {
    public class Node {
        private T data;
        private Node prior;
        private Node next;

        public Node(T data) {
            this.data = data;
        }
    }

    private Node head;
    private int size;

    public DLinkedList() {
        head = new Node(null);
        size = 0;
    }

    //在第i个位置处插入节点
    public void add(T data, int i) {
        if (i <= 0 || i > size + 1) {
            System.out.println("插入失败,插入位置" + i + "错误");
            return;
        }
        Node preNode = head;
        Node node = new Node(data);
        int count = 0;
        while (count != i - 1) {
            preNode = preNode.next;
            count++;
        }
        node.next = preNode.next;
        if (preNode.next != null) {
            preNode.next.prior = node;
        }
        node.prior = preNode;
        preNode.next = node;
        size++;
    }

    //删除第i个位置处的节点
    public void remove(int i) {
        if (i <= 0 || i > size) {
            System.out.println("删除失败,第" + i + "个位置上的节点不存在");
            return;
        }
        Node preNode = head;
        Node node = preNode.next;
        int count = 0;
        while (count != i - 1) {
            preNode = preNode.next;
            count++;
        }
        preNode.next = node.next;
        node.next.prior = preNode;
        size--;
    }

    //删除值为data的第一个节点
    public void removeData(T data) {
        if (size == 0) {
            System.out.println("该链表为空");
            return;
        }
        Node preNode = head;
        Node node = head.next;
        while (!node.data.equals(data)) {
            preNode = preNode.next;
            node = node.next;
            if (node == null) {
                System.out.println("删除失败,值为" + data + "的节点不存在");
                return;
            }
        }
        preNode.next = node.next;
        node.next.prior = preNode;
        size--;
    }

    //如果没有size,求表长
    public void length() {
        int count = 0;
        Node node = head.next;
        while (node != null) {
            node = node.next;
            count++;
        }
        System.out.println(count);
    }

    //按序号(第几个位置)查找节点
    public void searchIndex(int i) {
        if (i <= 0 || i > size) {
            System.out.println("查找失败,第" + i + "个位置上的节点不存在");
            return;
        }
        Node node = head.next;
        int count = 1;
        while (count != i) {
            node = node.next;
            count++;
        }
        System.out.println(node.data);
    }

    //按data查找节点
    public void searchData(T data) {
        Node node = head.next;
        while (!node.data.equals(data)) {
            node = node.next;
            if (node == null) {
                System.out.println("查找失败,值为" + data + "的节点不存在");
                return;
            }
        }
        System.out.println(node.data);
    }

    //遍历打印
    public void print() {
        Node node = head.next;
        while (node != null) {
            System.out.print(node.data + " ");
            node = node.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        DLinkedList<String> list = new DLinkedList<>();
        list.add("100", 1);
        list.add("200", 2);
        list.add("400", 3);
        list.add("300", 3);
        list.add("500", 5);
        list.add("700", 7);
        list.print();
        list.remove(6);
        list.remove(1);
        list.removeData("700");
        list.removeData("200");
        list.print();
        list.searchIndex(2);
        list.searchData("400");
        list.searchIndex(4);
        list.length();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值