查找链表倒数的节点

来源:互联网 发布:ubuntu 无法复制 编辑:程序博客网 时间:2024/06/05 05:00
虽然马上要实习了,但是基本的东西不要忘了,把以前一些东西继续温故知新。对于查找链表倒数的节点这个问题,就比较经典了,老生常谈的。大家都知道,最经典的解法就是首先找到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;}

加油坚持每一天!
这里写图片描述

0 0