leetcode题后感-01

今天双11,断断续续的节日,望断天涯路!

明年就要参加工作了,作为即将入职的菜鸟,倍感压力。得提前做好准备,刷刷算法题,让自己对java的理解有所提升,而且需要仔细体味java怎么才能高效,推荐Effective Java这本书,虽然我没看,但是我也即将加入学习大军中。

对于链表的算法题,找工作的时候问的非常频繁,现在回顾一下。第一题是链表反转。

链表反转有两种方法:一种是借助于栈来实现,遍历链表,将节点的引用存入栈中,然后通过出栈来实现反转;第二种方法是定义3个引用,第一个引用指向首节点,第二个引用指向第二个节点,第三个引用始终作为第二个节点的下一个节点,需要在循环中实现,先将head的next设为null,然后进入循环,第三个引用为第二个引用的next,每次将第二个引用的next指向第一个引用,然后第一个引用指向第一个引用,第二个引用指向第三个引用

 public ListNode reverseList(ListNode head) {
        
        // 1.安全及边界问题
        if(head==null||head.next==null) return head;
        
        // 2.定义一个栈来存储遍历过的节点
        Stack<ListNode> stack=new Stack<>();
        
        // 3.遍历链表
        ListNode temp=head;
        
        while(temp!=null){
            stack.push(temp);
            temp=temp.next;
        }
        
        // 4.弹出栈中的节点
        if(!stack.isEmpty()) temp=stack.pop();
        
        ListNode res=temp;
        while(!stack.isEmpty()){
            temp.next=stack.pop();
            temp=temp.next;
        }
        temp.next=null;//注意需要有此步,表名最后一个结点的后继为空
        
        return res;
        
    }
    public ListNode reverseList(ListNode head) {
        
        // 1.安全边界问题
        if(head==null||head.next==null) return head;
        
        //2.定义三个变量pre,slow用来描述新的链表(反转后的),fast用来遍历整个链表
        ListNode pre=head;
        ListNode slow=head.next;
        pre.next=null;
        ListNode fast=null;
        while(slow!=null){
            fast=slow.next;
            slow.next=pre;
            
            pre=slow;
            slow=fast;
        }
        
        return pre;
    }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值