牛客题霸NC53删除链表的倒数第n个节点Java题解
https://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6?tpId=117&&tqId=34974&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
方法:快慢指针
解题思路:利用快慢指针,让快指针former先走n步,然后再让快指针former和慢指针latter一起走,这样当快指针指向链表的末尾为null时,慢指针刚好指向链表的倒数第n个节点。再将第n个节点删除即可。这里利用了一个pre指针保存latter的前驱节点,便于删除操作。
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) {
if(head == null || n<=0){
return null;
}
ListNode former = head;
ListNode latter = head;
ListNode pre = null; //latter的前驱
//former先走n步
for(int i=0;i<n;i++){
if(former == null){ //n大于链表长度时
return null;
}
former = former.next;
}
//former和latter一起走
while(former!=null){
former = former.next;
pre = latter;
latter = latter.next;
}
//latter就是倒数第n个节点
//删除latter节点
if(pre!=null){
pre.next = latter.next;
}else{
//当pre==null时,删除头节点 例如:{1},1
head = head.next;
}
return head;
}
}
京公网安备 11010502036488号