19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) (leetcode-cn.com)
最容易想到的方法就是做两次遍历,第一次得到链表长度,第二次找到倒数N并删除。
还有一种双指针法,找倒数第N个元素就让 j 先走N-1步,之后 i,j 再一起走,直到 j 到达末尾,此时 i 就是要删除的结点。例如要找倒数第一个节点,j 就要先走0步,即 i,j 一起走直到末尾。
做链表的题还是创建一个虚拟头节点比较方便。
方法一
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int len = 0;
ListNode node = head;
while (node!=null){
len++;
node=node.next;
}
node = head;
ListNode HEAD = new ListNode(0,head);
ListNode pre = HEAD;
int index = len-n;
for(int i=0;i<index;i++){
pre = node;
node = node.next;
}
pre.next=node.next;
return HEAD.next;
}
}
方法二
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode HEAD = new ListNode(0,head);
ListNode pre = HEAD;
ListNode i = HEAD;
ListNode j = HEAD;
int forward = n-1;//j先走farward步
while (forward-->0){
j=j.next;
}
while (j.next!=null){
pre = i;
j=j.next;
i=i.next;
}
pre.next = i.next;
return HEAD.next;
}
}