Given a linked list, remove the n-th node from the end of list and return its head.
Example:
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Follow up:
Could you do this in one pass?
思路:两个指针,第一个指针先往后走n+1位,然后两个指针一起往后走,第一个指针到头之后把第二个指针所指的下一个元素删掉
package com.Medium.Ryan;
import com.Medium.wanghao.AddTwoNumber.ListNode;
public class RemoveNthNodeFromEndofList {
public static void main(String[] args) {
// TODO Auto-generated method stub
RemoveNthNodeFromEndofList removeNthNodeFromEndofList=new RemoveNthNodeFromEndofList();
ListNode l1 = new ListNode(1);
l1.next = new ListNode(2);
l1.next.next = new ListNode(3);
l1.next.next.next = new ListNode(4);
l1.next.next.next.next= new ListNode(5);
int n=2;
removeNthNodeFromEndofList.removeNthFromEnd(l1, n);
for (; l1 != null; l1 = l1.next) {
System.out.print(l1.val);
}
}
// Definition for singly-linked list.
public static class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode start=new ListNode(0);
start.next=head;
ListNode first=start;
ListNode second=start;
for (int i = 0; i <n; i++) {
first=first.next;
}
while(first.next!=null) {
first=first.next;
second=second.next;
}
second.next=second.next.next;
return start.next;
}
}