问题描述:找到单链表倒数第n个节点,保证链表中节点的最少数量为n。
样例:给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值1.
解题思路:创建新链表来创建两个指针dummy和head,用head遍历链表得出链表的长度。
用dummy进行for循环,遍历到第sum-1个节点,就得到倒数第n个节点最后返回dummy。
代码:
/**
* 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) {
// write your code here
ListNode *dummy=new ListNode(0);
dummy->next=head;
head=dummy;
int sum=0;int i;
while(head!=NULL)
{head=head->next;
sum++;
}
for(i=0;i<sum-n;i++)
{dummy=dummy->next;
}
return dummy;
}
};
感想:解题可以有多种方法,看了其同学的代码感觉这个思路很奇妙,想法独辟蹊径。
倒数第n个节点和最后一个节点间相隔n-1个节点,如果建立两个指向节点指针想办法让这两个指针之间相差n-1个节点的,两个指针同时移动,一个指针到达最后一个节点则另一个也就到达了倒数第n个节点,如此便找到了倒数第n个节点。
代码: if(head==NULL||n<1)
return NULL;
ListNode *dummy=head;
ListNode *m=head;
for(int i=1;i<n;i++)
{
head=head->next;
}
while(head->next!=NULL)
{
m=m->next;
head=head->next;
}
return m;