暴力解法,两次遍历,第一次遍历结点个数,第二次删除结点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int count = 1;
ListNode listNode = new ListNode(0,head);
while (head.next!=null){
count++;
head = head.next;
}
head = listNode;
for (int i = 0; i < count - n; i++) {
head = head.next;
}
head.next = head.next.next;
return listNode.next;
}
}
一次遍历的方法,非常巧妙。一对快慢指针,删除倒数第n个节点,让右指针移动n步,然后让左右指针同时移动,直到右指针指向链表末尾。删掉左所指向的节点就可以了。在应用中让右指针移动n+1步,这样的话left指针就可以指向待删除结点的前一个结点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode listNode = new ListNode(0,head);
ListNode left = listNode;
ListNode right = listNode;
for (int i = 0; i <= n; i++) {
right = right.next;
}
while (right!=null){
left = left.next;
right = right.next;
}
left.next = left.next.next;
return listNode.next;
}
}