首页 > 代码库 > [leetcode]_Remove Nth Node From End of List
[leetcode]_Remove Nth Node From End of List
题目:移除linked-list从尾到头的第N个元素
自我思路:因为题目给出的N是从链表尾开始计算的,单链表不存在从子指向父亲的反向指针,因此我先计算链表的整个长度len,然后用len - N来表示正向被删除元素所在的位置。
代码:
public ListNode removeNthFromEnd(ListNode head, int n) { if(head == null) return null; ListNode help = head; int length = 1; while(help.next != null){ length++; help = help.next; } if(n == length){ head = head.next; }else{ ListNode temp = head; for(int i = 1 ; i < length - n ; i++) temp = temp.next; if(n == 1) temp.next = null; else temp.next = temp.next.next; } return head; }
这样的算法有个很低效的地方,如果我要删除一个very very 长的链表的倒数第二个元素,我得先遍历一遍,这一步可能半小时过去了。然后我又得查找一遍,才能删除。
网络上的思路非常精辟,双指针(快指针 & 慢指针),虽然原理还没有很理解,但是举例这样的确能得到正确答案。快指针比慢指针先走N步,N步以后快慢指针同时继续走,当快指针走到链表尾部时,慢指针指向的就是被删除元素的前一个元素。精妙的思路。
public ListNode removeNthFromEnd(ListNode head, int n) { if(head == null) return null; ListNode fast = head; ListNode slow = head; int fastGo = n; while(n > 0 && fast.next != null){ fast = fast.next; n--; } if( n == 0 ){ while(fast.next != null){ fast = fast.next; slow = slow.next; } if(slow.next.next != null) slow.next = slow.next.next; else slow.next = null; }else{ head = head.next; } return head;
}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。