Given a linked list, remove the nth node from the end of list and return its head.node
For example,this
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.code
这题也是携程18年暑假实习生的笔试题。rem
最开始想的解法就是,先循环求链表的长度,再用长度-n,再循环一次就能移除该结点。结果对的,可是超时了。代码以下:it
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @param {number} n * @return {ListNode} */ var removeNthFromEnd = function(head, n) { let start = new ListNode(null); start.next = head; let len = 0, current = null, del = null; if(head === null){ len = 0; }else{ current = head; len = 1; while(current.next){ len++; } } let position = len - n; if(position > -1 && position < len){ current = head; let previous, index = 0; // 移除第一项 if(position === 0){ head = current.next; }else{ while(index < position){ previous = current; current = current.next; index++; } del = current; previous.next = current.next; } len--; return start.next; }else{ return null; } };
后来看了别人的最佳解法,以为本身太蠢了。
最佳解法:用两个指针,第一个指针slow的next指向第一个节点,第二个指针fast指向第n+1个结点,而后两个指针同时后移,直到fast指针指向null,这个时候slow指针指向要删除结点的前一个节点,使用slow.next = slow.next.next删除结点。再返回整个链表。代码以下:io
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @param {number} n * @return {ListNode} */ var removeNthFromEnd = function(head, n) { var start = new ListNode(null); start.next = head; let slow = start, fast = head; slow.next = head; if(head.next === null){ return null } for(var i = 0; i < n; i++){ fast = fast.next; } while(fast !== null){ slow = slow.next; fast = fast.next; } slow.next = slow.next.next; return start.next; };