java 手动实现单链表(尾插法和头插法)

头插法: 头插法的实现相对简单 思路是将新形成的节点的下一个赋值为header

               再把新形成的节点地址传给header即将header向前移动

import java.util.Random;
import java.util.Scanner;

public class Link {
    //创建一个存储数据的属性
    int data;
    //创建存储下一个节点地址的属性
    Link next;
    static int length=0;
    /**
     * 创建一个链表
     * @param len  产生数据的长度
     * @return  链表第一个节点地址
     */
    public static Link creat(int len){
        //定义随机对象
        Random r=new Random();
        //定义链表的节点
        Link newnode,header;
        //header永远存储第一个节点的地址,tailer永远存储最后一个节点的地址
        header=null;
        for (int i = 0; i < len; i++) {
            //生成一个随机数字
            int temp=r.nextInt(100);
            //创建一个临时节点
            newnode=new Link();
            //长度
            length++;
            //为属性赋值
            newnode.data=temp;
            //判断当前链表是否第一次赋值
            if(header==null){
                header=newnode;
            }else{
                //将新节点连接到链表的头部
                newnode.next=header;
                //header永远存储第一个节点的地址
                header=newnode;
            }
        }
        return header;
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("输入长度:");
        int l=sc.nextInt();
        System.out.println("打印数组:");
        //调用数组生成方法 传入键盘值l
        Link head=Link.creat(l);
        for (int i = 0; i < Link.length; i++) {
            System.out.print(head.data+" ");
            //把当前对象的下一个对象地址传给当前对象
            head=head.next;
        }
    }
}

尾插法: 尾插法相对于头插法有些许不同 因为要返回头 头不能动 所以需要一个tailer来记录最后一个值 tailer右移   

import java.util.Random;
import java.util.Scanner;

public class Link {
    //创建一个存储数据的属性
    int data;
    //创建存储下一个节点地址的属性
    Link next;
    static int length=0;
    /**
     * 创建一个链表
     * @param len  产生数据的长度
     * @return  链表第一个节点地址
     */
    public static Link creat(int len){
        //定义随机对象
        Random r=new Random();
        //定义链表的节点
        Link newnode,header,tailer;
        //header永远存储第一个节点的地址,tailer永远存储最后一个节点的地址
        header=tailer=null;
        for (int i = 0; i < len; i++) {
            //生成一个随机数字
            int temp=r.nextInt(100);
            //创建一个临时节点
            newnode=new Link();
            //长度
            length++;
            //为属性赋值
            newnode.data=temp;
            //判断当前链表是否第一次赋值
            if(header==null){
                header=tailer=newnode;
            }else{
                //将新节点连接到链表的尾部
                tailer.next=newnode;
                //tailer永远存储最后一个节点的地址
                tailer=newnode;
            }
        }
        return header;
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("输入长度:");
        int l=sc.nextInt();
        System.out.println("打印数组:");
        //调用数组生成方法 传入键盘值l
        Link head=Link.creat(l);
        for (int i = 0; i < Link.length; i++) {
            System.out.print(head.data+" ");
            //把当前对象的下一个对象地址传给当前对象
            head=head.next;
        }
    }
}

这里可以比较一下两种方法的不同:

头插法: if(header==null){                                                   尾插法: if(header==null){
                   header=newnode;                                                             header=tailer=newnode;
                }else{                                                                                     }else{
                //将新节点连接到链表的头部                                                 //将新节点连接到链表的尾部
                newnode.next=header;                                                       tailer.next=newnode;
                //header永远存储第一个节点的地址                                     //tailer永远存储最后一个节点的地址
                header=newnode;                                                               tailer=newnode;
                }                                                                                             }

猜你喜欢

转载自blog.csdn.net/joob000/article/details/81196165