题意:给出一个链表和一个数,删除链表倒数那个数对应的结点。
分析:这其实就是链表删除,链表只能顺序查找,删除的关键就是要找到找到结点的前一个结点和后一个结点。
我们要让一个结点走到 length-n 的地方,要么就是知道这一段是多么长(length需要走完一遍测量出来),然后再从头结点走这么长。
我们有没有办法不获得这个length - n 就走到那里呢?核心点要落在n身上。我们画图思考之后,发现如果我们把一段头在链表头的长为n的线移动到链表最后,那么这条线现在的头就在位置上了。头尾我们用两个结点来描述。
考虑异常情况:n > length 很好处理,但是怎么获取异常情况呢?n还没完的时候遍历到空就是了。而且我们发现,如果是正常情况,这个结点恰好可以作为那条线的尾端。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = head;
ListNode nex = null;
while(pre != null && n > 0)
{
pre = pre.next;
n--;
}
if(pre == null) //n > length
return head.next; //可能只有一个结点
nex = head;
pre = pre.next; //因为要走到删除结点的前一个。所以走之前要把那条线的长度先加一
while(pre!=null)
{
pre = pre.next;
nex = nex.next;
}//这时候的nex是要删除的结点的前一个。
ListNode next = nex.next.next;
nex.next = next;
return head;
}
}