[编程题] 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;
    }
posted @ 2020-08-02 17:29  北鼻coder  阅读(154)  评论(0编辑  收藏  举报