• 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
  • 相关阅读:
    ROS系统MoveIt玩转双臂机器人系列(六)--D-H逆运动学求解程序(C++)
    ROS系统MoveIt玩转双臂机器人系列(五)--浅议机器人运动学与D-H建模
    ROS系统MoveIt玩转双臂机器人系列(四)--用户接口的使用
    ROS系统MoveIt玩转双臂机器人系列(三)--利用controller控制实际机器人
    ROS系统MoveIt玩转双臂机器人系列(二)--生成MoveIt配置包
    总纲篇:产品结构设计指导VII(本博客指引章节)
    高阶篇:1)概念设计-总章
    进阶篇:3.3)DFM-铸造件设计总章
    进阶篇:3.4.3)DFM钻削件设计指南
    进阶篇:3.4.4)DFM铣削件设计指南
  • 原文地址:https://www.cnblogs.com/wangpan8721/p/13680785.html
Copyright © 2020-2023  润新知