题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
使用一趟扫描实现
思路:定义一个tail尾结点,定义一个pre结点,两者相隔为n,当尾结点到达第n个结点以后,pre结点开始随尾结点向后移动,直到尾结点到达尾部,pre结点到达倒数第n个结*点。本题依据这个思路做细微调整
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/*
*思路:定义一个tail尾结点,定义一个pre结点,两者相隔为n,当尾结点到达第n个结点以后,pre结点开始随尾结点向后移动,直到尾结点到达尾部,pre结点到达倒数第n个结*点。本题依据这个思路做细微调整
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//用于指向链表头部,最后返回结果
ListNode ret=head;
ListNode pre=head;
//定义了一个带头结点的链表(即第一个结点不存储数据,仅用来指向下一结点)
ListNode tail=new ListNode(0);
tail.next=head;
int i=0;
while(tail.next!=null)
{
++i;
tail=tail.next;
if(i>n+1)
{
pre=pre.next;
}
}
//当n==i时,说明删除的是第一个结点,则直接返回后续结点即可
if(n==i)
{
return ret.next;
}
pre.next=pre.next.next;
return ret;
}
}