/*
正常方法需要遍历一遍获取长度,然后找到n跳过
one pass方法思路:
n = 2
|
1 2 3 4
first0 1 2 3
| | |
| |
sec 0 1 2
| |-> 4
1 建立两个listnode 用于操作
2 让第一个listnode先走到 n所在的位置
3 然后 两个listnode同时走到第一个结束 这时第二个listnode正好在n位置的前一个
4 然后跳过即可。
注意: 为了避免越界 先建立一个以0 开头的listnode 把next付给head return时直接return next就好;
*/
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode result = new ListNode(0);
result.next = head;
ListNode first = result;
ListNode second = result;
for(int i = 0; i <= n; i++) {
first = first.next;
}
while(first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return result.next;
}
}
正常方法需要遍历一遍获取长度,然后找到n跳过
one pass方法思路:
n = 2
|
1 2 3 4
first0 1 2 3
| | |
| |
sec 0 1 2
| |-> 4
1 建立两个listnode 用于操作
2 让第一个listnode先走到 n所在的位置
3 然后 两个listnode同时走到第一个结束 这时第二个listnode正好在n位置的前一个
4 然后跳过即可。
注意: 为了避免越界 先建立一个以0 开头的listnode 把next付给head return时直接return next就好;
*/
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode result = new ListNode(0);
result.next = head;
ListNode first = result;
ListNode second = result;
for(int i = 0; i <= n; i++) {
first = first.next;
}
while(first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return result.next;
}
}