1、单链表

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

Java 单链表 递归遍历 java单链表的实现_指定位置

图中展示了一个单链表的存储原理。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();
 }