给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
第一种:俩次遍历,第一次遍历求得长度,第二次遍历根据长度来删除对应结点
var removeNthFromEnd = function(head, n) {
var len = 0,
i = 0,
k = 1,
l = head,
p = null;
while(l) {
len++;
l = l.next;
}
l = head;
i = len - (n - 1);
if(len == n) i = len; //n为总长度
while(l) {
if(k == i && l.next) { // 节点数不为1
p.next = l.next;
return head;
}else { // 节点数为1
return null;
}
p = l;
l = l.next;
k++;
}
};
第二种:一次遍历。利用next属性将倒数转为正数,以改题为例,l先正数n次,利用next属性通过while使r从0走过总长与n的差值即为所需删除结点的前一个节点。
var removeNthFromEnd = function(head, n) {
var l = head,
r = head;
while (n-- && l) {
l = l.next;
}
//if (!l && r.next) return r.next; // 传入的链表中节点数大于1且要删除的倒数节点大小与链表节点数相等
// if (!l && !r.next) return new ListNode('');// 传入链表节点数为1且删除1个节点
if(!l) return r.next;
while (l.next) {
l = l.next;
r = r.next;
}
r.next = r.next.next;
return head;
};
总结:要删除不论正向、反向都应找到要删除结点的前一个节点。
网友评论