[编程题] nk [删除链表中的倒数第n个节点]
[编程题] nk 删除链表中的倒数第n个节点
题目信息
思路
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;
}