标签:style blog class c code java
题目:移除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;
}
[leetcode]_Remove Nth Node From End of List,布布扣,bubuko.com
[leetcode]_Remove Nth Node From End of List
标签:style blog class c code java
原文地址:http://www.cnblogs.com/glamourousGirl/p/3731613.html