一般思路:
先遍历链表,计算出链表中的元素个数n,倒数第k个元素是正数第n-k+1个元素,因此再遍历一次链表即可。
Linknode* FindthToTail(Linknode* head, unsigned int k)
{
if ((head == NULL) || (k == 0))
return NULL;
int count = 0;
Linknode* pointer = head;
while (pointer) {
count++;
pointer = pointer->next;
}
if (count < k)
return NULL;
Linknode* find = head;
for (int i = 1; i <= count - k;i++) {
find = find->next;
}
//find->next = NULL; //该语句是为了输出倒数第k个节点,
//如果不加,则输出从倒数第k个节点开始的链表
return find;
}
更好的解法:
只遍历一次链表就得到结果。
思路:
- 创建指针pointer,向前移动k-1个节点;
- 然后创建指针find,从第k个节点开始,find与pointer同步右移;
- 直至pointer为空,此时find正好移动了n-k个节点,指向链表的第n-k+1个节点;
- 返回该节点。
注意:问清楚面试官返回的是单节点还是从要找的节点开始的链表。
Linknode* FindthToTail(Linknode* head, unsigned int k)
{
if ((head == NULL) || (k == 0))
return NULL;
Linknode* pointer = head;
Linknode* find = head;
unsigned int i = 1;
while (pointer->next != NULL) {
if (i < k) {
pointer = pointer->next;
i++;
}
else {
pointer = pointer->next;
find = find->next;
i++;
}
}
if (i < k) //如果遍历完整个链表i(i是链表中节点个数)还是小于k
//说明该链表的倒数第k个节点不存在,因此返回空
return NULL;
return find;
}
主函数:
int main() {
Linknode* head1 = create_link(1);
Linknode* head2 = create_link(2);
Linknode* head3 = create_link(3);
Linknode* head4 = create_link(4);
Linknode* head5 = create_link(5);
Linknode* head6 = create_link(6);
Linknode* head7 = create_link(7);
Linknode* head8 = create_link(8);
connection_linknode(head1, head2);
connection_linknode(head2, head3);
connection_linknode(head3, head4);
connection_linknode(head4, head5);
connection_linknode(head5, head6);
connection_linknode(head6, head7);
connection_linknode(head7, head8);
printf("建立单链表:\n");
print_link(head1);
printf("链表倒数第1个节点:\n");
Linknode* find1 = FindthToTail(head1, 1);
print_link(find1);
printf("*****************************\n");
printf("链表倒数第3个节点:\n");
Linknode* find2 = FindthToTail(head1, 3);
print_link(find2);
printf("*****************************\n");
printf("链表倒数第8个节点:\n");
Linknode* find3 = FindthToTail(head1, 8);
print_link(find3);
printf("*****************************\n");
return 0;
}
与链表相关的定义和函数在头文件structDef.h中,可在文章C语言:删除链表中的重复节点(二)中查找。
链表为:1->2->3->4->5->6->7->8
运行结果: