6.7-3求链表倒数第n项

来源:互联网 发布:互联网医院 知乎 编辑:程序博客网 时间:2024/06/05 10:11

求链式线性表的倒数第K项

1.建立双向链表
注意查询错误位置输出
2.考研题思路
定义两个指针a,b,都指向链表头节点,然后将b向后移k次,再将a,b同时向后移,当b到达链表末尾时a指向的那个节点值即是倒数第K项。注意特殊情况的考虑,比如链表总长度刚好等于K或者小于K等。
#include<stdio.h>  #include<stdlib.h>    typedef struct node *ptrNode;  typedef ptrNode LinkList;  //头结点  typedef ptrNode Position;//中间节点  typedef int ElementType;  struct node{      ElementType Element;      Position next;  };    LinkList creatList(void)                {      LinkList head,r,p;      int x;      head = (struct node*)malloc(sizeof(struct node));    //生成新结点。节点生成很耗时,考虑改掉      r = head;      scanf("%d",&x);        while(x >= 0){          p = (struct node*)malloc(sizeof(struct node));          p->Element = x;          r->next = p;          r = p;          scanf("%d",&x);      }      r->next = NULL;      return head;  }    void printLastKth(LinkList L, int k)  {      Position ha, hb;      int i;        ha = L;      hb = L;            for(i = 0; i < k; i++){              hb = hb->next;              if(hb == NULL)                  break;          }          if(hb == NULL)                  printf("NULL");          else{              while(hb != NULL){                  hb = hb->next;                  ha = ha->next;              }              printf("%d",ha->Element);          }    }    void destroyLinkList(LinkList L)  {      LinkList p,q;      p = L->next;      while(p){          q = p->next;          free(p);          p = q;      }      L = NULL;  }    int main(void)  {      LinkList L;      int k;        scanf("%d",&k);      L = creatList();        printLastKth(L, k);            destroyLinkList(L);              return 0;  }