给定一个链表,删除链表的倒数第 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;
}