找到单链表倒数第n个节点,保证链表中节点的最少数量为n。
样例
给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1.
一种是先遍历一遍单链表,计算链表的长度,然后再次遍历,直到到达节点数减去n的节点,返回结果。实际情况中若链表数目很多而n相对不大,这种方法需要大约两次遍历。
更简单的是采用双指针。快指针比慢指针提前n个单元。当快指针到达单链表尾部时,慢指针指向待删除节点的前节点。
双指针方法可以解决很多问题,比如上一个求单链表是否有环,也是使用两个指针,一个进一步,一个进两步,如果有环两指针就会相遇。
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @param n: An integer.
* @return: Nth to last node of a singly linked list.
*/
ListNode *nthToLast(ListNode *head, int n) {
if(head==NULL||n==0){
return NULL;
}
ListNode *p=head;
ListNode *pre=head;
while(--n){
if(p->next==NULL){
return NULL;
}else{
p=p->next;
}
}
while(p->next){
p=p->next;
pre=pre->next;
}
return pre;
}
};