虽然马上要实习了,但是基本的东西不要忘了,把以前一些东西继续温故知新。对于查找链表倒数的节点这个问题,就比较经典了,老生常谈的。大家都知道,最经典的解法就是首先找到k-1个,然后两个指针,一前一后跑,知道后面的指针跑到最后一个,前面的指针也就是指向了倒数第k个节点了。
不过在这里需要注意以下几种情况。
一、当链表为空时
二、当输入非法时,例如输入小于等于0
三、当输入的k大于链表的总节点数时
这些情况在源代码中都有说明,如果有问题,请大家及时提醒我更正。
/*这是一道经典的面试题,求得链表中的第倒数第k个节点*/
#include<stdio.h>
#include<stdlib.h>
typedef struct data{
int value;
struct data * next;
} * Node;
/*开始查找倒数第k个*/
Node search_k_Node(Node head,int k){
Node front,rear = head;
int i;
if(rear == NULL){
printf("此链表为空链表");
return NULL;
}
if(k <= 0){
printf("输入位置不合法");
return NULL;
}
for(i = 1;rear != NULL && i< k; i++){
/*这里根据i的初始值不容,选择不同的结束条件,还有,如果链表带头节点,也需要分情况*/
rear = rear->next;
}
//如果rear等于NULL,并且i不等于K,证明输入的k大于节点总数
if(NULL == rear && i <= k){
printf("输入的k大于总节点数");
return NULL;
}
front = head;
while(rear->next != NULL){
rear = rear->next;
front = front->next;
}
return front;
}
//输出
void outPuts(Node head){
Node p;
for(p = head; p != NULL; p= p->next){
printf("%d ",p->value);
}
}
//初始化
Node initLinkedList(){
Node head = NULL,p = NULL,q;
int i;
for(i = 1; i<=10;i++){
if(i == 1){
head = (Node)malloc(sizeof(struct data));
head->next = NULL;
head->value = i;
p = head;
}
else{
q = (Node)malloc(sizeof(struct data));
q->next = NULL;
q->value = i;
p->next = q;
p=q;
}
}
return head;
}
int main(void){
Node head,result;
int k;
printf("请输入要求的的倒数第k个节点的k:");
scanf("%d",&k);
head = initLinkedList();
outPuts(head);
result = search_k_Node(head,k);
if(NULL != result){
printf("结果是:%d",result->value);
}
return 0;
}
加油坚持每一天!