单链表及其常见操作简单代码实现

package alo;

import java.util.Stack;

public class 单链表_SingleLinkedList { //动态分配内存,地址不一定连续,时间复杂度O(n),空间复杂度O(1)

    public static void main(String[] ags){
        SingleLinkedList sin=new SingleLinkedList();
        sin.add("白","李");
        sin.add("轼","苏");
        sin.add("甫","杜");
        sin.insert(2,"信","李");
        sin.add("歌","元");
        sin.update("李信",3,"信","李");
        sin.remove("李信");
        sin.showLinked();
        System.out.println(sin.getNum());
        System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!测试reversePrint!!!!!!!!!!!!!!!!!");
        sin.showReverseLinked();
        System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!测试reverse!!!!!!!!!!!!!!!!!!!!!!");
        sin.reverse();
        sin.showLinked();

    }




}

class Node{
    public Node next;
    public String firstName;
    public String lastName;
    public int no;

    public Node(){}
    public Node(int no,String lastName,String firstName){
        this.no=no;
        this.lastName=lastName;
        this.firstName=firstName;
    }
    public String toString(){
        return "lastName="+lastName+",firstName="+firstName;
    }
}



class SingleLinkedList{
    private final Node head=new Node(0, "人","诗");
    private static int index=0;
    public SingleLinkedList(){};

    public void add(String lastName,String firstName){
        Node indexNode=head;                  //获得第一个节点
        while(true){
            if(indexNode.next==null){
                indexNode.next=new Node(++index,lastName,firstName);  //直到next为空的时候出来赋值
                break;                               //出口
            }else{
                indexNode=indexNode.next;
            }
        }

    }

    public void insert(int no,String lastName,String firstName){
        Node indexNode=head;
        Node backNode;
        Node newNode=new Node(no,lastName,firstName);
        while(true){
            if(indexNode.next==null){                 //到结尾还没匹配使用add加入
                this.add(lastName,firstName);
                break;
            }
            else if(indexNode.next.no>no){         //当索引节点的next的no比插入的大了,则索引节点的next为新节点,新节点的下一个为先前保存的后一个节点
                backNode=indexNode.next;         //保存后一个节点
                indexNode.next=newNode;           //索引节点的下一个
                newNode.next=backNode;            //新节点的下一个
                System.out.println("已插入:"+firstName+lastName);
                break;                            //break,防止遍历到最后再add一下
            }
            indexNode=indexNode.next;
        }
    }

    public void update(String name,int no,String lastName,String firstName){    //改对应名字的信息,最好重载一下
        Node indexNode=head;
        while(true){
            if(indexNode.next==null){
                break;
            }
            if((indexNode.firstName+indexNode.lastName).equals(name)){
                indexNode.firstName=firstName;
                indexNode.lastName=lastName;
                indexNode.no=no;
                System.out.println("已更改:"+name);
                break;
            }
            indexNode=indexNode.next;


        }

    }
    public void pop(){
        Node index =head;
        while(true){
            if(index.next.next==null){
                index.next=null;
                break;
            }
            index=index.next;
        }
    }

    public void remove(String name){
        Node indexNode=head;

        while(true){
            if(indexNode.next==null){
                pop();
                break;
            }
            if((indexNode.next.firstName+indexNode.next.lastName).equals(name)) {  //用index.next判断可以省去不少事

                indexNode.next = indexNode.next.next;
                System.out.println("已删除:"+name);
                break;
            }
            indexNode=indexNode.next;
        }

    }

    public void showLinked(){             //打印所有节点
        Node n=head;
        while(true){
            if(n==null){
                System.out.println("结束!");
                break;
            }
            System.out.printf("no=%s,name=%s%s ",n.no,n.firstName,n.lastName);
            System.out.println(n);         //print引用数据类型自动调用toString()
            n=n.next;
        }
    }
    public int getNum(){            //获得节点个数
        Node o=head;
        int in=0;
        while(true){
            if(o.next==null){
                ++in;
                break;
            }
            o=o.next;
            in++;
        }
        return in;
    }

    public void reverse(){                          //链表反转
        if(this.getNum()==2 || this.getNum()==1){
            return;
        }
        Node indexNode= new Node();       //用来替换的
        Node index=head.next;
        Node nex;
        while(index!=null){
            nex=index.next;
            index.next=indexNode.next;
            indexNode.next=index;
            index=nex;
        }
        this.head.next=indexNode.next;
    }


//    public void showReverseLinked(){                //反向打印所有节点
//        for(int a=0;a<this.getNum();a++){
//            Node index=head;
//            for(int b=0;b<this.getNum()-a-1;b++){
//                index=index.next;
//            }
//            System.out.println("no="+index.no+",name="+index.lastName+index.firstName+" "+index);
//        }
//    }

    public void showReverseLinked(){        //栈实现单链表反转打印
        if(head.next==null){
            return;
        }
        Stack<Node> stack=new Stack<Node>();
        Node index=head;
        while(true){
            if(index.next==null){
                stack.add(index);
                break;
            }
            stack.add(index);
            index=index.next;
        }

        while(stack.size()>0){
            Node inde= stack.pop();
            System.out.println("no="+inde.no+",name="+inde.lastName+inde.firstName+" "+inde);
        }


    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值