Given a linked list, remove the nth node from the end of list and return its head.
For 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.
Try to do this in one pass.
这道题我的思路是,用两个List存储数据,第一个存放读取的最后N(N<=n)个数,当达到n时,每存一个数就将第一个数放到第二个List的后面,从而保证第一个List只有n个数。这样,当遍历完之后,第一个List存放后n个数,第二个存放前面的数,需要删掉倒数第n个,就将第一个List的第二个数放在第二个List后面即可~代码如下:
public ListNode removeNthFromEnd(ListNode head, int n) {
int n1 = 1;
ListNode list1 = new ListNode(head.val);
ListNode list2 = new ListNode(head.val);
head = head.next;
ListNode head_1 = list1;
ListNode head_2 = list2;
while(head != null){
ListNode node = new ListNode(head.val);
list1.next = node;
head = head.next;
list1 = node;
n1++;
if(n1 > n){
list2.next = head_1;
list2 = head_1;
head_1 = head_1.next;
}
}
list2.next = head_1.next;
return head_2.next;
}
在网上看到还有一种想法是:设置两个指针first跟second。first指针先移动n步,若此时first指针为空,则表示要删除的是头节点,此时直接返回head->next即可。如果first指针不为空,则将两个指针一起移动,直到first指针指向最后一个节点,令second->next=second->next->next即可删除第你n个节点。
也蛮有道理哈,就不亲自实现了,反正第一种方法也很快了,只用了1ms