查找链表倒数的节点

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值