java-单链表

Node 类:

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

}

MyLinkedList类

//链表操作

//1-基础
//是否空
//链表长度-用成员变量表示,增删操作同步(效果同调用函数遍历)

//2-操作
//添加节点-末尾
//插入节点-索引
//根据索引删除节点
//根据值-删除节点(所有)
//根据值-删除重复节点(除了第一个所有)
//根据值-删除节点(第一个)
//更新节点
//清空链表

//3-查询
//表中是否存在某值
//根据索引获取某一节点值
//根据值获取节点索引[数组]
//根据值获取第一个节点索引

//4-遍历
//正向遍历
//反转链表
//反向遍历

//5-判断
//创建有环链表
//是否有环
//去除重复元素,

//链表排序

import java.util.ArrayList;

public class MyLinkedList {
    private int length=0;
    private Node head=new Node();

    //构造函数默认就行,创建再添加节点

    //是否空
    public boolean isEmpty(){
        if(this.length==0)
            return true;
        else
            return false;
    }
    //添加节点-末尾
    public void add(int data){
        Node newNode=new Node(data);
        Node p=this.head;
        //空表
        if(length==0){
            head.next=newNode;
        }
        //非空表
        else{
            //遍历至链表尾部
            while(p.next!=null)
                p=p.next;
            p.next=newNode;
        }
        this.length++;
    }
    //插入节点-索引  [1-length+1]
    public void insert(int index,int data){
        Node p=this.head;
        Node newNode=new Node(data);
        //插入位置保错
        if(index<1||index>length+1){
            System.out.println("插入位置出错");
        }
        //插在末尾
        else if(index==length+1){
            this.add(data);
        }
        //插在表头
        else if(index==1){
            newNode.next=head.next;
            head.next=newNode;
            length++;
        }
        else{
            //遍历到插入位置前
            for(int i=0;i<index-1;i++){
                p=p.next;
            }
            newNode.next=p.next;
            p.next=newNode;
            length++;
        }
    }
    //根据索引删除节点
    public void delete(int index){
        if(!isEmpty()){
            //插入位置保错
            if(index<1||index>length){
                System.out.println("删除位置出错");
            }
            //删除头节点
            else if(index==1){
                Node p=head.next;
                head.next=p.next;
                length--;
            }
            else{
                //遍历至待删节点前
                Node p=head;
                for(int i=0;i<index-1;i++){
                    p=p.next;
                }

                Node dp=p.next;
                p.next=dp.next;
                length--;
            }
        }
        else
            System.out.println("链表空,无法进行删除操作");
    }
    //根据值-删除节点(所有)
    public void deleteall(int data){
        ArrayList<Integer> indexs=getAllIndex(data);
        if(indexs.size()==0){
            return;
        }else{
            //从后往前删除,不用变index;
            for(int i=indexs.size()-1;i>=0;i--){
                delete(indexs.get(i));
            }
        }
    }//根据值-删除重复节点(除了第一个所有)
    public void deletellARepeat(int data){
        ArrayList<Integer> indexs=getAllIndex(data);
        if(indexs.size()==0){
            return;
        }else{
            //从后往前删除,不用变index;留下index[0]即可
            for(int i=indexs.size()-1;i>=1;i--){
                delete(indexs.get(i));
            }
        }
    }
    //根据值-删除节点(第一个)
    public void deletefirst(int data){
        int index=getFirstIndex(data);
        if(index==-1){
            return;
        }else{
            delete(index);
        }
    }
    //更新节点
    public void update(int index,int data){
        if(!isEmpty()){
            //更新位置保错
            if(index<1||index>length){
                System.out.println("更新位置出错");
            }
            else if(index==1){
               head.next.data=data;
            }
            else{
                //遍历至更新节点
                Node p=head;
                for(int i=0;i<index;i++){
                    p=p.next;
                }
                p.data=data;
            }
        }else
            System.out.println("链表空,无法进行更新操作");

    }
    //清空链表
    public void clear(){
        head.next=null;
        length=0;
    }
    //表中是否存在某值
    public boolean isHave(int data){
        if(!isEmpty()){
            Node p=head;
            while(p.next!=null){
                p=p.next;
                if(p.data==data)
                    return true;
            }
            return false;
        }else{
            System.out.println("链表空,无数据");
            return false;
        }
    }
    //根据索引获取某一节点值
    public int getData(int index){
        if(!isEmpty()){
            if(index<1||index>length){
                System.out.println("index出错");
                return -1;
            }
            else if(index==1){
                return head.next.data;
            }
            else{
                //遍历至待删节点前
                Node p=head;
                for(int i=0;i<index;i++){
                    p=p.next;
                }
                return p.data;
            }
        }else{
            System.out.println("链表空,无数据");
            return -1;
        }
    }
    //根据值获取节点索引[数组]
    public ArrayList<Integer> getAllIndex(int data){
        ArrayList<Integer> indexs=new ArrayList<Integer>();
        if(isHave(data)){
            Node p=head;
            int i=0;
            while(p.next!=null){
                p=p.next;
                i++;
                if(p.data==data)
                    indexs.add(i);
            }
            return indexs;
        }else {
            System.out.println("链表无此数据");
            ArrayList<Integer> in=new ArrayList<Integer>();
            return in;
        }
    }
    //根据值获取第一个节点索引
    public int getFirstIndex(int data){
        if(isHave(data)){
            //遍历到节点
            Node p=head;
            int i=0;
            while(p.next!=null){
                p=p.next;
                i++;
                if(p.data==data)
                    break;
            }
            return i;
        }else {
            System.out.println("链表无此数据");
            return -1;
        }
    }
    //正向遍历
    public void print_1(){
        if(!isEmpty()){
            System.out.print("链表为:");
            Node p=head;
            while(p.next!=null){
                p=p.next;
                System.out.print(p.data+"->");
            }
            System.out.println("null");
        }else
            System.out.println("链表空,无数据,无输出");
    }
    //反转链表
    public MyLinkedList reverse(MyLinkedList myLinkedList){
        if(!isEmpty()){
            if(length==1)
                return myLinkedList;
            else{
                Node curNode=head.next;
                Node preNode=null;
                while(curNode!=null){
                    Node nextNode=curNode.next;
                    curNode.next=preNode;
                    preNode=curNode;
                    curNode=nextNode;
                }
                head.next=preNode;
                return myLinkedList;
            }
        }else{
            System.out.println("链表空,无法反转");
            MyLinkedList mylist=new MyLinkedList();
            return mylist;
        }

    }
    //反向遍历
    //反转-正向遍历
    //正向遍历,入栈-出栈
    public void print_2(){
        if(!isEmpty()){
            MyLinkedList mylist1=reverse(this);
            MyLinkedList mylist=reverse(mylist1);
            System.out.print("反转");
            mylist.print_1();
        }else
            System.out.println("链表空,无数据,无输出");
    }

    //创建有环链表
    //将最后一个节点next指向前一个
    public void toRinged(){
        Node curNode=head;
        Node nextNode=curNode.next;
        while(curNode.next!=null&&curNode.next.next!=null){
            curNode=nextNode;
            nextNode=nextNode.next;
        }
        nextNode.next=curNode;
    }
    //是否有环
    //判断链表是否有环:
    //设置快指针和慢指针,慢指针每次走一步,快指针每次走两步
    //当快指针与慢指针相等时,就说明该链表有环
    public boolean isRinged(){
        if(!isEmpty()){
            if(length==1){
                System.out.println("链表长度=1,无环");
                return false;
            }else{
                Node slow=head;
                Node fast=head;
                while(fast.next!=null&&fast.next.next!=null){
                    slow=slow.next;
                    fast=fast.next.next;
                    if(fast==slow)
                        return true;
                }
                return false;
            }
        }else{
            System.out.println("链表空,无环");
            return false;
        }
    }
    //去除重复元素
    public void deleteRepeatData(){
        if(length<2){
            System.out.println("链表长度<2,无重复数据");
        }else{
            MyLinkedList mylist=new MyLinkedList();
            Node p=head.next;
            //将原链表中无重复数据添加到新链表;
            mylist.add(p.data);
            while(p.next!=null){
               p=p.next;
               //System.out.print(p.data+" "+!mylist.isHave(p.data)+ " ");
               if(!mylist.isHave(p.data))
                   mylist.add(p.data);
            }
            //对新链表的每一个data执行this(原链表).deleteAllRepeat(data)
            Node p1=mylist.head;
            while(p1.next!=null){
                p1=p1.next;
                //System.out.print(p1.data+" " );
                this.deletellARepeat(p1.data);
            }
        }
    }
    //排序-冒泡
    //交换函数
    public void swip(Node p1,Node p2){
        int a=p1.data;
        p1.data=p2.data;
        p2.data=a;
    }
    public void bubbleSort(){
        if(length<2){
            System.out.println("链表长度<2,无法排序");
        }else {

            for(int i=1;i<length;i++){
                //第一个循环,先遍历到未排序序列首部
                Node p=head;
                for(int j=0;j<i;j++){
                    p=p.next;
                }
                //第二个循环比大小,交换,将最大值上浮至末尾
                Node curNode=p;
                Node nextNode=curNode.next;
                if(curNode.data>nextNode.data)
                    swip(curNode,nextNode);
                while(curNode.next!=null&&curNode.next.next!=null){
                    curNode=nextNode;
                    nextNode=nextNode.next;
                    if(curNode.data>nextNode.data)
                        swip(curNode,nextNode);
                }
                //将末尾最大值放到本层循环挑出来的,未排序的首部,下层未排序首部加1
                swip(p,nextNode);
            }
        }
    }
}
View Code

验证类-test

public class linkedListTest {
    public static void main(String args[]) {
        //空?添加,正反遍历
        MyLinkedList mylist=new MyLinkedList();
        System.out.println("isEmpty: "+mylist.isEmpty());
        mylist.add(6);
        mylist.add(5);
        mylist.add(4);
        mylist.add(3);
        System.out.println("isEmpty: "+mylist.isEmpty());
        mylist.print_1();
        mylist.print_2();
        //插入
        mylist.insert(1,14);
        mylist.print_1();
        mylist.insert(3,14);
        mylist.print_1();
        mylist.insert(17,14);
        mylist.print_1();
        //删除
        mylist.delete(0);
        mylist.print_1();
        mylist.delete(4);
        mylist.print_1();
        mylist.delete(17);
        mylist.print_1();
        //删除重复我-前提:获取index数组
        //mylist.deleteall(14);
       // mylist.deletellARepeat(14);
        mylist.deletefirst(14);
        mylist.print_1();

        //更新
        mylist.update(2,144);
        mylist.print_1();
        mylist.update(0,144);
        mylist.print_1();
        mylist.update(17,144);
        mylist.print_1();
        //清空
        //mylist.clear();
       // mylist.print_1();

        //get
        System.out.println(mylist.getData(0));
        System.out.println(mylist.getData(3));
        System.out.println(mylist.getData(17));
        //成环
//        mylist.toRinged();
//        System.out.println("isRinged: "+mylist.isRinged());
//        mylist.print_1();

        //去重复
        MyLinkedList mylist2=mylist;
        mylist2.add(6);
        mylist2.add(6);
        mylist2.add(17);
        mylist2.add(17);
        mylist2.add(8);
        mylist2.add(8);
        mylist2.print_1();

        mylist2.deleteRepeatData();
        mylist2.print_1();
        //排序
        mylist2.bubbleSort();
        mylist2.print_1();

    }
}
View Code
原文地址:https://www.cnblogs.com/wangpan8721/p/13680785.html