思路:为了保持删除头结点和其他节点操作一致,引入虚拟头结点duumyNode。
假设链表长度为len,删除倒数第n个节点就是删除第len-n+1个节点,删除链表节点需要使用待删除节点 的前驱节点,所以p从虚拟头结点开始走len-n步,然后执行p.next=p.next.next即可
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
if(head==null)return null;
ListNode dummyNode=new ListNode(0);
dummyNode.next=head;
int len=length(head);
int step=len-n;
ListNode p=dummyNode;
for(int i=0;i<step;i++){
p=p.next;
}
p.next=p.next.next;
return dummyNode.next;
}
int length(ListNode pHead){
if(pHead==null)return 0;
int len=0;
ListNode p=pHead;
while(p!=null){
p=p.next;
len++;
}
return len;
}
}