赞
踩
解法1:不需要去遍历两次,一次即可,思路是,用两个指针p,q先指向头节点,让q指针走到第n个位置,然后两个指针同时往后走,走到q.next==null是说明p已经到达倒数第n个节点的前面的那个节点,此时删除下一个节点即可。
注意:当删除头节点和只有一个元素的情况。
执行用时 : 2 ms,95.78% .内存消耗 : 34.4 MB, 89.34% 。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { if(head==null) return head; ListNode p = head; ListNode q =head; //用count记录走了多少步,和最终链表的长度 int count=0; while(q.next!=null){ count++; //前n步只让q指针走 if(count<=n){ q=q.next; }else{ q=q.next; p=p.next; } } //循环结束时p到达了倒数n个元素的前面一个元素 //两个特殊情况,即链表只有一个元素和要删除的为头节点的情况 if(head.next==null || count+1 == n){ head=head.next; }else{ p.next=p.next.next; } return head; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。