zoukankan      html  css  js  c++  java
  • [编程题] nk [删除链表中的倒数第n个节点]

    [编程题] nk 删除链表中的倒数第n个节点

    题目信息

    image-20200802172218357

    思路

    1、删除倒数,那么我们可以先遍历一次链表得到总的节点个数,把删除倒数换算成删除正数的索引。

    2、由于节点没有索引,但是我们可以指定一个跟踪索引,比如一开始的cur节点指的是head.next那么我们就记录当前遍历的索引是1,指针后移一次,我们索引加1.

    • 特使情况:如果要删除链表首节点

      直接返回head.next

    • 如果删除的节点的索引介于1~(节点个数-1)那么可以使用双指针的指向来删除

      pre.next = cur.next;

    Java代码

    import java.util.*;
    
    /*
     * public class ListNode {
     *   int val;
     *   ListNode next = null;
     * }
     */
    
    public class Solution {
        /**
         * 
         * @param head ListNode类 
         * @param n int整型 
         * @return ListNode类
         */
        /*思想|:删除倒数的某节点,换算位正数的节点的索引值*/
        public ListNode removeNthFromEnd (ListNode head, int n) {
            // write code here
            //链表有lenth个节点
            int length = 0;
            ListNode dummy = head;
            while(dummy!=null){
                length++;
                dummy = dummy.next;
            }
            
            //要删除节点的index
            int index = length-n;
            //如果删除链表首节点的话
            if(index==0){
                return head.next;
            }
            
            //删除的节点索引必须位于有效范围内
            if(index>0 && index<length){
                ListNode pre = head;
                ListNode cur = head.next;
                int nowIndex= 1;  //因为当前的cur指向的是head.next,故指定当前索引是1
                while(cur!=null){
                    if(nowIndex==index){
                        //如果是我们要删除的节点的话,就直接删除
                        pre.next = cur.next;
                        break;
                    }else{
                        //如果还不是我们要删除的节点的索引,我们就指针移动,并且索引++
                        pre = cur;
                        cur = cur.next;
                        nowIndex++;
                    }
                }
            }else{
                throw new RuntimeException("非法");
            }
    
            return head;
        }
    }
    

    方法2:双指针

        public ListNode FindKthToTail(ListNode head,int k) {
    
            ListNode first = head;
            ListNode second = head;
            
            for(int i=0;i<k;i++){
                //有可能是k跃出链表长度的非法值
                if(first==null)  {return null;}
                first = first.next;
            }
            
            while(first!=null){
                first = first.next;
                second = second.next;
            }
            
            //返回
            return second;
        }
    
  • 相关阅读:
    一个短信验证码倒计时插件
    记一次图片优化经历
    前端开发中两种常见的图片加载方式
    《javascript面向对象精要》读书笔记
    less hack 兼容
    第一次项目总结
    你总说毕业遥遥无期,可转眼就各奔东西
    【翻译】理念:无冲突的扩展本地DOM原型
    【翻译】jQuery是有害的
    202002280156-《统治世界的10种算法(摘自极客大学堂)》
  • 原文地址:https://www.cnblogs.com/jiyongjia/p/13419770.html
Copyright © 2011-2022 走看看