查找链表倒数第k个节点

算法思想:p指向当前遍历的节点,q指向p的前k个节点。

代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef struct LNode{
  int data;
  struct LNode *next;
}LNode;

void create(LNode *&A,int n) //创建链表
{
    int i,a[30];
    LNode *s,*r;
    A=(LNode *)malloc(sizeof(LNode));
    A->next=NULL;
    r=A;
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        s=(LNode *)malloc(sizeof(LNode));
        s->data=a[i];
        r->next=s;
        r=r->next;
    }
    r->next=NULL;
}
void print(LNode *A) //输出链表
{
   LNode *p;
   p=A;
   while(p->next!=NULL)
   {
       printf("%d ",p->next->data);
       p=p->next;
   }
   printf("\n");
}

int find(LNode *A,int k)
{
    LNode *p,*q;
    int i=0;
    p=A;
    q=A;
    while(p->next!=NULL)
    {
        i++;
        p=p->next;
        if(i==k) break;
    }
    if(i<k) return 0;
    else
    {
        q=q->next;
        while(p->next!=NULL)
        {
            p=p->next;
            q=q->next;
        }
        printf("%d \n",q->data);
        return 1;
    }
}
int main()
{
    LNode *A;
    int n;
    scanf("%d",&n);
    create(A,n);
    int k;
    scanf("%d",&k);
    find(A,k);
    return 0;
}

优化:

int find(LNode *A,int k)
{
    LNode *p,*q;
    int i=0;
    p=A;
    q=A;
    while(p->next!=NULL)
    {
        i++;
        p=p->next;
        if(i>=k) q=q->next;
    }
    if(i<k) return 0;
    else
    {
        printf("%d \n",q->data);
        return 1;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39350434/article/details/81264221