Java双向链表的实现

最近在复习Java的基础知识,看到了List时,想起学习C++时,曾用结构体构造有头链表,所以好奇如何使用Java构造链表,遂有了如下代码:
实现了链表的双向添加,双向遍历,删除值;
本例中,头结点和尾节点是单独出来的,value属性为null,只是为了方便读取而存在的,不存储具体的对象;

//链表的节点类,MyNode.java
package my;

public class MyNode<T>
{
    public T value;          //节点值
    public MyNode<T> previous;//前一个,如果没有这个参数的话,不好从后向前遍历
    public MyNode<T> next;

    public MyNode(T value)
    {
        this.value = value;
        this.next = null;
        this.previous = null;
    }

    public T getValue()
    {
        return value;
    }

    public void setValue(T value)
    {
        this.value = value;
    }

    public MyNode<T> getPrevious()
    {
        return previous;
    }

    public void setPrevious(MyNode<T> previous)
    {
        this.previous = previous;
    }

    public MyNode<T> getNext()
    {
        return next;
    }

    public void setNext(MyNode<T> next)
    {
        this.next = next;
    }

}
//链表的具体实现类:MyList.java 
package my;
//该列表是否可以存放异构对象,去掉本类的泛型是否可以;结论:将T设为Object时,该列表可以存放异构对象,
public class MyList<T>
{ 
    //是否可以先建立一个内部类,在内部类中定义节点属性;结果:新建了一个节点类,把节点单独作为一个对象使用;使用内部类也是可以的;
    public MyNode head = new MyNode(null);
    public MyNode last = new MyNode(null);

    public MyList()
    {
        head.previous = null;
        head.next = last;
        last.previous = head;
        last.previous = null;
    }

    public void addtoHead(T value)
    {
        MyNode node = new MyNode(value);
        head.next.previous = node;
        node.next = head.next;
        node.previous = head;
        head.next = node;
    }

    public void addtoLast(T value)
    {
        MyNode node = new MyNode(value);
        last.previous.next = node;
        node.previous = last.previous;
        node.next = last;
        last.previous = node;
    }

    //删除节点,使用value,如果加上下标的话,就变成hash表了;删除第一个相同的value
    public void delete(T value) throws Exception
    {
        MyNode node = head.next;
        while(node != null && node != last)
        {
            if(node.getValue() == value)
            {
                //删除
                node.previous.next = node.next;
                node.next.previous = node.previous;
                node = null;
                break;
            }
            node = node.next;
        }
        boolean isTheLast = node==last;
        if(isTheLast)
        {
            throw new Exception("链表中不存在:"+value);
        }       
        //System.out.println("是否为last:"+isTheLast);

    }

    //链表的双向遍历
    public void printListFromHead() throws Exception
    {
        MyNode node = head.next;
        if(node == last)
        {
            throw new Exception("链表为空");
        }
        while(node != null && node != last)
        {
            System.out.println(node.getValue() + "");
            node = node.next;
        }
    }
    public void printListFromLast() throws Exception
    {
        MyNode node = last.previous;
        if(node == head)
        {
            throw new Exception("链表为空");
        }
        while(node != null && node != head)
        {
            System.out.println(node.getValue() + "");
            node = node.previous;
        }
    }

    public MyNode getHead()
    {
        return head;
    }

    public void setHead(MyNode head)
    {
        this.head = head;
    }

    public MyNode getLast()
    {
        return last;
    }

    public void setLast(MyNode last)
    {
        this.last = last;
    }
}
//测试类:test1.java
package my;
public class test1
{
    /**
     * 链表测试
     * 
     * @param args
     */
    public static void main(String[] args)
    {
        try
        {
            MyList<String> myList1 = new MyList<String>();
            myList1.addtoHead("ppp");
            myList1.addtoHead("ssd");
            myList1.addtoHead("sdf");
            myList1.addtoHead("so");
            myList1.addtoHead("123");
            myList1.addtoHead("ppp");

            System.out.println("-------正向遍历测试--------");
            myList1.printListFromHead();
            System.out.println("-------反向遍历测试--------");
            myList1.printListFromLast();

            System.out.println("---------删除测试------------------------------");
            myList1.delete("ppp");
            myList1.printListFromHead();

            System.out
                    .println("---------是否可以存放异构对象------------------------------");
            MyList<Object> myList2 = new MyList<Object>();
            myList2.addtoHead("sdf");
            myList2.addtoHead(123);
            myList2.addtoHead(2323.23);
            myList2.addtoHead("sdf");
            myList2.addtoHead("123");

            myList2.printListFromHead();

            try
            {
                System.out
                        .println("---------空链表异常测试------------------------------");
                MyList<String> myList0 = new MyList<String>();

                myList0.printListFromHead();// 出现异常,直接跳转至catch中执行;
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        } catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
要使用 Java 双向链表实现学生管理系统,可以按照以下步骤进行: ### 1. 定义学生类 首先,定义一个学生类,包含学生的基本信息,如学号、姓名、性别等。 ```java class Student { private String id; private String name; private String gender; public Student(String id, String name, String gender) { this.id = id; this.name = name; this.gender = gender; } public String getId() { return id; } public String getName() { return name; } public String getGender() { return gender; } @Override public String toString() { return "Student{id='" + id + "', name='" + name + "', gender='" + gender + "'}"; } } ``` ### 2. 定义双向链表节点类 定义一个双向链表的节点类,每个节点包含一个学生对象以及指向前一个节点和后一个节点的引用。 ```java class Node { Student student; Node prev; Node next; public Node(Student student) { this.student = student; this.prev = null; this.next = null; } } ``` ### 3. 定义双向链表实现双向链表的基本操作,如插入、删除、查找等。 ```java class DoublyLinkedList { private Node head; private Node tail; private int size; public DoublyLinkedList() { head = null; tail = null; size = 0; } // 插入学生信息到链表尾部 public void addStudent(Student student) { Node newNode = new Node(student); if (head == null) { head = newNode; tail = newNode; } else { tail.next = newNode; newNode.prev = tail; tail = newNode; } size++; } // 根据学号删除学生信息 public boolean removeStudent(String id) { Node current = head; while (current != null) { if (current.student.getId().equals(id)) { if (current.prev != null) { current.prev.next = current.next; } else { head = current.next; } if (current.next != null) { current.next.prev = current.prev; } else { tail = current.prev; } size--; return true; } current = current.next; } return false; } // 根据学号查找学生信息 public Student findStudent(String id) { Node current = head; while (current != null) { if (current.student.getId().equals(id)) { return current.student; } current = current.next; } return null; } // 显示所有学生信息 public void displayStudents() { Node current = head; while (current != null) { System.out.println(current.student); current = current.next; } } public int getSize() { return size; } } ``` ### 4. 实现学生管理系统类 使用双向链表实现学生管理系统的主要功能,如添加学生、删除学生、查找学生等。 ```java public class StudentManagementSystem { private DoublyLinkedList studentList; public StudentManagementSystem() { studentList = new DoublyLinkedList(); } public void addStudent(Student student) { studentList.addStudent(student); } public boolean removeStudent(String id) { return studentList.removeStudent(id); } public Student findStudent(String id) { return studentList.findStudent(id); } public void displayStudents() { studentList.displayStudents(); } public static void main(String[] args) { StudentManagementSystem sms = new StudentManagementSystem(); // 添加学生信息 sms.addStudent(new Student("001", "Alice", "Female")); sms.addStudent(new Student("002", "Bob", "Male")); // 显示所有学生信息 System.out.println("All students:"); sms.displayStudents(); // 查找学生信息 Student foundStudent = sms.findStudent("001"); if (foundStudent != null) { System.out.println("Found student: " + foundStudent); } else { System.out.println("Student not found."); } // 删除学生信息 boolean removed = sms.removeStudent("002"); if (removed) { System.out.println("Student removed successfully."); } else { System.out.println("Student not found for removal."); } // 显示更新后的学生信息 System.out.println("Updated students:"); sms.displayStudents(); } } ``` ### 代码解释 - **Student 类**:用于存储学生的基本信息,包含学号、姓名和性别。 - **Node 类**:双向链表的节点类,每个节点包含一个学生对象以及指向前一个节点和后一个节点的引用。 - **DoublyLinkedList 类**:实现双向链表的基本操作,如插入、删除、查找等。 - **StudentManagementSystem 类**:使用双向链表实现了学生管理系统的主要功能,如添加学生、删除学生、查找学生等。 通过以上步骤,就可以使用 Java 双向链表实现一个简单的学生管理系统。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值