欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 手写单向链表

程序员文章站 2024-03-18 11:47:34
...
package cn.yang.com;

public class MyLinkedList {
    //定义一个头节点
    Node head;
    //链表的长度
    int size;

    class Node {
        //真实数据
        int data;
        //next指针,指向下一个节点对象
        Node next;

        //构造函数
        public Node(int data) {
            this.data = data;
        }
    }

    //增加节点,顺序插入,也就是在尾部追加数据
    public void addNode(int data) {
        //头节点处理                     如果头节点为null,那么直接将data放入头节点里
        if (head == null) {
            head = new Node(data);
            size++;
            return;
        }
        //遍历到尾节点                    如果头节点不为null,那么直接生成一个临时节点,将头节点赋予临时节点
        Node temp = head;               //赋予临时节点
        while (temp.next != null) {     //遍历到尾节点,如果 next 不为null,那么一直往后遍历,直到取到末节点
            temp = temp.next;
        }
        //跳出循环,尾节点找到
        //找到尾节点,赋值
        temp.next = new Node(data);     //将尾节点的next元素设置为data
        size++;                         //链表长度+1
    }

    public Node deleteNode(int index) { //删除节点方法
        //处理空链表
        if (size == 0) {                //如果size==0代表空链表,直接返回null就okay
            return null;
        }
        //处理异常索引
        if (index < 1 || index > size) {//处理索引异常判断
            return null;
        }
        //删除头节点
        if (index == 1) {               //索引为1
            Node temp = head;           //将头节点赋予临时节点
            head = head.next;           //将头节点的next节点变为头节点
            size--;
            return temp;
        }
        //删除非头节点
        //从头节点的下一个节点开始遍历
        Node cureNode = head.next;
        //记录当前循环的节点的上一个节点用于删除当前节点
        Node preNode=head;
        int i=2;
        while(cureNode!=null){
            if(i==index){               //判断是否删除该元素
                //要删除的就是此节点
                preNode.next=cureNode.next;
                size--;
                break;
            }else{                      //else将当前节点重新赋值,并将 i++
                preNode=cureNode;
                cureNode=cureNode.next;
                i++;
            }
        }
        return cureNode;
    }

    //打印链表
    public void printList(){
        Node curNode=head;
        //循坏遍历到尾节点
        while(curNode!=null){
            System.out.print(curNode.data+" ");
            curNode=curNode.next;
        }
        System.out.println();
    }

    //返回链表长度
    public int getSize(){
        return size;
    }

    public static void main(String[] args) {
        MyLinkedList myLinkedList=new MyLinkedList();
        myLinkedList.addNode(10);
        myLinkedList.addNode(20);
        myLinkedList.addNode(30);
        myLinkedList.printList();
        System.out.println("链表长度= "+myLinkedList.getSize());
        System.out.println("------------删除链表-------------");
        Node node = myLinkedList.deleteNode(3);
        System.out.println("删除的节点数据是:"+node.data);
        myLinkedList.printList();
        System.out.println("链表长度= "+myLinkedList.getSize());
    }
}