单链表的代码实现以及部分简单面试题(java)

这次单链表的代码包含增加、删除、修改、打印链表信息的方法以及运用这些方法,完成部分很简单的面试题,也是跟着视频学,自己理解后再敲代码。代码如下:

public class SingleLinkedListdemo {
    public static void main(String[] args) {
//        基本数据准备
        Heronode hero1=new Heronode(1,"宋江","及时雨");
        Heronode hero2=new Heronode(2,"卢俊义","玉麒麟");
        Heronode hero3=new Heronode(3,"吴用","智多星");
        Heronode hero4=new Heronode(4,"林冲","豹子头");
        //创建链表
        SingleLinkedList singleLinkedList=new SingleLinkedList();
        //加入节点
        singleLinkedList.add(hero1);
        singleLinkedList.add(hero2);
        singleLinkedList.add(hero3);
        singleLinkedList.add(hero4);
        singleLinkedList.list();//打印链表信息
        System.out.println("-----------------------------------------------------------------------");
       System.out.println("修改节点信息操作");
        //修改节点信息
        Heronode newhero=new Heronode(2,"小卢","玉麒麟_");
        singleLinkedList.update(newhero);
        singleLinkedList.list();//打印链表信息
        System.out.println("-----------------------------------------------------------------------");
        System.out.println("删除节点信息操作");
        //删除节点
        singleLinkedList.delete(4);//删除no为4号的节点
        singleLinkedList.list();//打印链表信息
        System.out.println("-------------------------------------------------------------------");
        // --------------------------------------分割线-----------------------------------------------
        System.out.println("面试题");
        System.out.println("1.有效节点个数为:"+getlength(singleLinkedList.gethead()));
        System.out.println("2.获取倒数第K个节点(新浪面试题)");
        System.out.println("链表信息如下");
        singleLinkedList.list();
        int index=3;//设置寻找倒数第index的值
        Heronode res= findLastNode(singleLinkedList.gethead(),index);//获取倒数第1(index)个
        System.out.println("倒数第"+index+"信息为"+"res="+res);
        System.out.println("------------------------------------");
        System.out.println("3.单链表的反转(腾讯面试题)");
        System.out.println("原来链表的情况");
        singleLinkedList.list();
        System.out.println("链表反转后的情况");
        reverseList(singleLinkedList.gethead());
        singleLinkedList.list();
    }
    /** getlength()方法获取单链表节点个数
     * @param head 链表头节点
     * @return 返回节点个数
     */
    public static int getlength(Heronode head){
        if(head.next==null){
            System.out.println("链表为空");
        }
        int length=0;
        Heronode temp=head.next;
        while(temp!=null){
            length++;
            temp=temp.next;
        }
        return length;
    }

    /**
     *findLastNode()找倒数第index个节点
     * @param head 头节点
     * @param index 坐标
     * @return
     */
    public  static  Heronode findLastNode(Heronode head,int index){
        if(head.next==null){
            System.out.println("寻找倒数第K个节点时:链表为空");
        }
        //得到链表的长度length
        int length = getlength(head);
        //遍历到length-index位置,该位置就是倒数的第index个节点
        //校验index
        if(index<=0 ||index >length){
            System.out.println("无效位置index");
            return null;
        }
        //定义辅助变量
        Heronode temp = head.next;
        for (int i=0;i<length-index;i++){
            temp=temp.next;
        }
        return temp;
    }

    /**
     * 单链表反转(腾讯面试题)
     * @param head 头节点
     */
    public static void reverseList(Heronode head){
        //思路:从头到尾遍历原来链表,每遍历一个节点,就将当前节点转移到新链表中的最前端,最后遍历完成后,新链表就是旧链表的反转。
        if(head.next==null||head.next.next==null){//当前链表为空,或者只有一个节点
            return;
        }
        Heronode temp=head.next;//辅助变量,遍历原来的链表
        Heronode next=null;//指向原来链表中当前准备移动到新链表的节点的下一个节点,如果没有next指向下一个节点,移动当前节点后,后面的节点就会丢失。
        Heronode reverseHead =new Heronode(0,"","");//新链表的头节点
        //遍历原来链表并转移节点到新链表
        while(temp!=null){
            next=temp.next;//保存当前节点的下一个节点,否则就会丢失
            temp.next=reverseHead.next;//将当前节点的next指向新链表中第一个节点
            reverseHead.next=temp;//再将新链表中头节点的next(类似指针)指向当前节点,到这里就相当将节点转移到新链表的最前端。
            temp=next;
        }
        head.next=reverseHead.next;//新链表连接到旧链表中的头节点,实现反转
    }
}
class Heronode{//定义类
    public int no;
    public String name;
    public String nickname;
    public Heronode next;//指向下一个节点
    //构造器
    public Heronode(int no,String name,String nickname){
        this.no=no;
        this.name=name;
        this.nickname=nickname;
    }
    //重构显示方法
    public String toString(){
        return "HeroNode[no="+no+",name="+name+",nickname="+nickname+",next="+next+"]";
    }
}
//
class SingleLinkedList{
    //初始化头节点
    private Heronode head=new Heronode(0,"","");
    //获取单链表的头节点
    public Heronode gethead(){
        return head;
    }
    //添加节点到单向链表
    public void add(Heronode heronode){
        Heronode temp=head;
        while(temp.next!=null){//移动到最后的节点,
            temp=temp.next;
        }
        temp.next=heronode;//链尾添加新节点
    }

    //打印链表所有节点
    public void list(){
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        Heronode temp=head.next;
        while(temp!=null){
            System.out.println(temp.toString());
            temp=temp.next;
        }
    }

    //修改节点数据(根据no编号)
    public void update(Heronode heronode){
        //判断链表是否为空
        if(head.next==null){
            System.out.println("链表为空");
            return;
        }
        //寻找要修改的节点(已经确定链表有节点)
        Heronode temp=head.next;//定义辅助变量
        boolean flag=false;//标记是否找到指定节点
        while(true){
            if(temp==null){
                System.out.println("没有指定的节点");
                break;
            }
            if(temp.no==heronode.no){
                flag=true;//找到节点,标记设置为true
                break;
            }
            temp=temp.next;
        }
        //flag为true,证明有指定节点,修改信息
        if(flag){
            temp.name=heronode.name;
            temp.nickname= head.nickname;
        }
    }

    //删除节点
    public void delete (int no){
        //寻找要修改的节点
        Heronode temp=head;//定义辅助变量
        boolean flag=false;//标记是否找到指定节点
        while(true){
            if(temp.next==null){//一开始只有头节点,无法删除,退出循环或者有节点但没有找到,已经到链表最后,退出循环
                System.out.println("没有指定的节点");
                break;
            }
            if(temp.next.no==no){
                flag=true;//找到节点,标记设置为true
                break;
            }
            temp=temp.next;
        }
        //flag为true,证明有指定节点,删除节点
        if(flag){
            temp.next=temp.next.next;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值