您的位置:首页 > 其它

查找链表倒数的节点

2016-07-18 00:42 211 查看
虽然马上要实习了,但是基本的东西不要忘了,把以前一些东西继续温故知新。对于查找链表倒数的节点这个问题,就比较经典了,老生常谈的。大家都知道,最经典的解法就是首先找到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;
}


加油坚持每一天!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 指针