#include <stdio.h> #include <string.h> #include <stdlib.h> /* 找到⼀个未知长度单链表的倒数第K个节点。 提示: head—>1—>2—>3—>4—>5—>6—>7—>8—>9—>10—>NULL 其中倒数第0个节点是NULL,倒数第1个节点是10,倒数第10个节点是1. */ //第一种方法:先遍历一遍,然后计算链表的长度 // 然后使用指针跳动 //第二中方法:使用两个指针,第二个指针跳k下,然后和第一个指针一起跳,直到第二个指针指向NULL, // 第一个指针指的就是倒数第k个节点 typedef struct Node { int data; struct Node *next; }Node; //从尾部添加节点 void AppendtoEnd(Node *head,int data) { Node *new_node=NULL; Node *temp=NULL; new_node=malloc(sizeof(Node)); new_node->data=data; new_node->next=NULL; //找到最后一个节点 temp=head; for(;temp->next!=NULL;temp=temp->next); temp->next=new_node; } //打印链表 void ShowList(Node *head) { Node *temp=NULL; if(head==NULL) { return ; } temp=head->next; for(;temp!=NULL;temp=temp->next) { printf("%d",temp->data); printf("-->"); } printf("\n"); } //实现找到倒数第k个节点 Node *FindLastk(Node *head, int k) { Node *first=head; Node *second=head; int i=0; //前指针先走k步 for(i=0;i<k;i++) { first=first->next; } //两个一起走,直到前指针非法 for(;first!=NULL;first=first->next,second=second->next); return second; } int main(void) { int i=0; int k=10; Node *k_node=NULL; Node *head=malloc(sizeof(Node)); head->next=NULL; for(i=1;i<11;i++) { AppendtoEnd(head, i); } ShowList(head); if(k == 0) { printf("NULL\n"); } else { k_node=FindLastk(head, k); printf("倒数第%d个节点是%d\n",k,k_node->data); } free(head); return 0; }