19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
两边遍历方法:第一遍遍历得出链表长度,第二遍遍历删掉指定节点
/**
* 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) {
ListNode dummy=new ListNode(0);
dummy.next=head;
int length=0;
ListNode first=head;
while(first!=null)//第一遍遍历得出链表长度
{
length++;
first=first.next;
}
length=length-n;
first=dummy;
for(int i=0;i<length;i++)//第二遍遍历删掉指定节点
{
first=first.next;
}
first.next=first.next.next;
return dummy.next;
}
}
双指针方法:第一个指针先走n+1步,然后两个指针一起走,直到第一个指针为null时,第二个指针刚好到倒数第n-1个节点,然后删除第n个节点即可
/**
* 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) {
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode first=dummy;
ListNode second=dummy;
for(int i=0;i<n+1;i++)//第一个指针先走n+1步
{
first=first.next;
}
while(first!=null)//两个指针一起走,直到第一个指针为null时
{
first=first.next;
second=second.next;
}
second.next=second.next.next;//删除第n个节点
return dummy.next;
}
}