19. Remove Nth Node From End of List

19. Remove Nth Node From End of List

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.

 1 /**
 2  * Definition for singly-linked list.
 3  * function ListNode(val) {
 4  *     this.val = val;
 5  *     this.next = null;
 6  * }
 7  */
 8 /**
 9  * @param {ListNode} head
10  * @param {number} n
11  * @return {ListNode}
12  */
13 var removeNthFromEnd = function(head, n) {
14     
15     //这种操作链表的,又不知道链表长度的问题,往往也是用双指针去做,比如还有快慢指针判断链表环
16     
17     
18     //本题还要考虑几种特殊情况,比如说删除头节点 和 删除尾节点
19     
20     //我们会有3个指针,1个是head的头指针,1个是fir指针,它会先走n补,作为预处理,las指针比fir少走n步
21     
22     //首先考虑什么时候是删除尾节点的?  n==1 的时候是删除伪结点的。那直接移到最后,再将倒数第二个的next ==null 即可
23     
24     //那什么时候是删除头结点的? 很明显就是fir指针先走了n-1步之后,它的next直接是null了,这种情况就是删除头结点的。我们只需要返回head.next即可
25     
26     //还有一个问题。如果链表中只有1个节点,怎么办?此时n必然为1。预处理好像解决不了问题。
27 
28     var fir = head;  //先走n步
29     var las = fir;   
30     
31     
32     
33     //这种是处理单节点的链表
34     if(n == 1 && fir.next == null){
35         return null;
36     }
37     
38     //不然就是超过2个节点以上的
39     
40     for(var i = 0;i<n;i++){
41         
42         fir = fir.next;
43         
44     }
45     
46     //说明是删除头指针
47     if(fir == null){
48         return head.next;
49     }
50     
51     
52     
53     
54     //先走了n步的next为null时,就是las到达目标位置
55     while(fir.next){
56        las = las.next;
57        fir = fir.next;
58     }
59     
60     //删除las.next;
61     las.next = las.next.next;
62     
63     return head;
64 };

 

posted @ 2017-10-12 14:55  hdu胡恩超  阅读(121)  评论(0编辑  收藏  举报