剑指offer-链表中倒数第k个结点

链表中倒数第k个结点

http://www.nowcoder.com/questionTerminal/529d3ae5a407492994ad2a246518148a

  • 用栈的解法:链表中倒数的节点,自然想到遍历+栈。弹出栈中第k个元素即可;

    import java.util.Stack;
    public class Solution {
      public ListNode FindKthToTail(ListNode head,int k) {
          if(head==null || k==0){
              return null;
          }
    
          int len=0,i;
          Stack<ListNode> s = new Stack<>();
          int cur;
    
          while(head!=null){
              s.push(head);
              head=head.next;
              len++;
          }
          //如果k大于链表长度,返回null
          if(len<k){
              return null;
          }else{
              //k=1不会进入这个循环而是直接return s.pop();
              //边界条件是k>=2!此处循环次数是k-1
              while(!s.isEmpty() && k>=2){
                  s.pop();
                  k--;
              }
          }
          return s.pop();
      }
    }

    在代码实现中出栈次数的边界条件是while(!s.isEmpty()&&k>=2),k>=2原因是Java索引从0开始,所以至少要使得k>=1,而在return时pop了一次,所以循环的次数要-1,即k>=2。

  • 快慢指针
    快指针先走k步,然后快慢指针一起走。当快指针来到链表最后指向null时,慢指针指向的是倒数第k个节点。

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head==null || k==0){
            return null;
        }

        ListNode fast=head;
        ListNode slow=head;
        while(k>=1){
            //如果k大于链表长度,返回null
            if(fast==null){
                return null;
            }
            fast=fast.next;
            k--;
        } 
        while(fast!=null){
            slow=slow.next;
            fast=fast.next;
        }
    return slow;

}

快慢指针题目合集:https://mp.weixin.qq.com/s/5t_dlnrceoSoIM1snxmBdw

全部评论

相关推荐

兄弟们,绩效自评一定得给自己打A啊!千万别谦虚给低分,不然领导正愁给谁高分,你这不就“主动请缨”了嘛,而且多数领导不会给你更高分。我几年前试用期绩效自评打了B,领导就给了同等级,还好是试用期。真别等领导主动给高评价!
准备进厂的劳伦斯很迷人:小学时候有个册子 自评 小组 老师 我谦虚打了个b 小组别人给我打b 老师来句我觉得能给他打a 但是小组长说他自评是b怎么能打高呢 那时候我才明白的道理
点赞 评论 收藏
分享
kl_我是东山啊:《相关公司:阿里巴巴》
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务