public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
int length = 0;
ListNode first = head;
while (first != null) {
length++;
first = first.next;
}
length -= n;
first = dummy;
while (length > 0) {
length--;
first = first.next;
}
first.next = first.next.next;
return dummy.next;
}
图 2. 删除链表的倒数第 N 个元素
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy;
ListNode second = dummy;
// Advances first pointer so that the gap between first and second is n nodes apart
for (int i = 1; i <= n + 1; i++) {
first = first.next;
}
// Move first to the end, maintaining the gap
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
}
方法2踩过的坑
如果不设置哑结点,自己写的代码见下:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre=head;
ListNode tmp=head;
int i=0;
while(i<n){
pre=pre.next;
i++;
}
while (pre.next!=null){
pre=pre.next;
tmp=tmp.next;
}
tmp.next=tmp.next.next;
return head;
}
}
此方法不适用于在链表[1,2]中找到倒数第2个结点,会报空指针异常,而设置哑结点后此问题就可以得到解决,哑结点的位置是在链表head的前面,把哑结点的next连接到head
参考链接
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/solution/shan-chu-lian-biao-de-dao-shu-di-nge-jie-dian-by-l/