Java-单链表实现

1、单链表

链表是最基本的数据结构,存储原理如图:

图中展示了一个单链表的存储原理。head为头节点,它不存放任何数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,每个节点中都有一个next引用,指向下一个节点,以此类推,直到最后一个节点的next指向null。

2、单链表实现(Java)

2.1、编写一个Node类充当结点的模型。其中有两个属性,①存放数据的data,②存放下一个结点的引用。

public class Node{
    // 为了方便,这两个变量都使用public
    // 存放数据的变量,简单使用int型
    public int data;
    // 存放结点的变量,默认为null
    public Node next;

    // 构造方法,在构造时就能给data赋值
    public Node(int data){
        this.data = data;
    }
}

2.2、单链表的简单操作(增加、删除、获取总长度、链表元素排序、链表遍历)
    head
    addNode(Node):void 增加节点
    insertNodeByIndex(int,Node):void 插入节点到指定位置
    delNodeByIndex(int):void 删除指定位置的结点
    selectSortNode():void 通过选择排序对链表进行排序
    insertSortNode():void 通过插入排序对链表进行排序
    length():int 链表的长度
    print():void 打印链表中的所有结点的data
    main(String[]):void 

2.2.1、增加结点操作,addNode(Node)
/**
 *增加操作
 *    直接在链表的最后插入新增的结点即可
 *    将原本最后一个结点的next指向新结点
**/
    public void addNode(Node node){
        // 链表中有结点,遍历到最后一个结点
        Node temp = head; //一个移动的指针(把头结点看做一个指向结点的指针)
        while(temp.next != null){ //遍历单链表,直到遍历到最后一个则跳出循环
            temp = temp.next;  //往后移一个结点,指向下一个结点。
        }
        temp.next = node;  //temp为最后一个结点或者是头结点,将其next指向新结点。
    }

2.2.2、插入结点到链表的指定位置,insertNodeByIndex(int index,Node node)
/**
*insertNodeByIndex:在链表的指定位置插入结点
*    插入操作需要知道1个结点即可,当前位置的前一个结点
*index:插入链表的位置,从1开始
*node:插入的结点
**/
    public void insertNodeByIndex(int index,Node node){
        // 首先判定指定位置是否合法
        if(index<1||index>length()+1){
            System.out.println("插入的位置不合法");
            return;
        }

        int length = 1; //记录我们遍历到第几个结点了,也就是记录位置。
        Node temp = head; //可移动的指针
        while(head.next != null){ //遍历单链表
            if(index == length++){ //判断是否达到指定位置
                // 注意,我们的temp代表的是当前位置的前一个结点
                //前一个结点    当前位置    后一个结点
                //temp         temp.next   temp.next.next
                node.next = temp.next;
                temp.next = node;
                return;
            }
            temp = temp.next;
        }

    }


2.2.3、删除指定位置上的结点  delNodeByIndex(int index)
/**
*通过index删除指定位置的结点,跟指定位置增加结点是一样的,先找到准确的位置。然后进行删除操作。
*    删除操作需要知道1个结点即可:和当前位置的前一个结点。
*@param index: 链表中的位置,从1开始
**/
public void delNodeByIndex(int index){
    //判断index是否合理
    if(index<1 || index>length()){
        System.out.println("给定的位置不合理");
        return;
    }

    // 步骤跟insertNodeByIndex是一样的,只是操作不一样。
    int length=1;
    Node temp = head;
    while(temp.next != null){
        if(index == length++){
            //删除操作
            temp.next = temp.next.next;
            return;
        }
        temp = temp.next;
    }
}


2.2.4、计算单链表的长度
/**
*计算单链表的长度,也就是有多少个结点
*return 结点个数
**/
public int length(){
    int length =0;
    Node temp = head;
    while(temp.next != null){
        length++;
        temp = temp.next;
    }
    return length;
}


2.2.5、遍历单链表,打印data
/**
*遍历单链表,打印所有data
**/
public void print(){
    Node temp = head.next;
    while(temp != null){
        System.out.print(temp.data+",");
        temp = temp.next;
    }
    System.out.println();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值