给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
解法:
/*** 思路1:朴素法,第一遍遍历找到链表长度,第二遍找到应删除元素的正序index* @param head* @param n* @return*/public ListNode removeNthFromEnd(ListNode head, int n) {int len=0;ListNode node = head;while(node!=null) {len++;node=node.next;}node=head;if(len==n) {return head.next;}for(int i=0;i<(len-n-1);i++) {node=node.next;}node.next=node.next.next;return head;}
思路2:双指针法
/*** 思路2:双指针法* 指针1与指针2间隔为n,当指针2到达尾部的时候,指针1的next就是应删除的元素* @param head* @param n* @return*/public ListNode removeNthFromEnd(ListNode head, int n) {ListNode ya = new ListNode(0);ya.next = head;ListNode p1 = ya, p2=ya;for(int i=0;i<n;i++) {p1=p1.next;}while(p1.next!=null) {p1=p1.next;p2=p2.next;}p2.next = p2.next.next;return ya.next;}