小白算法积累——单链表21#带头结点单链表+倒数查找

题目:已知一个带有表头结点的单链表,结点结构为data|link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。
若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0。
关键字:带头结点单链表+倒数查找

思路
关注:
本题的关键是设计一个尽可能高效的算法,通过链表的一次遍历,找到倒数第k个结点的位置。运用“空间调换”的思想

发现:
倒数第k个元素,永远就是正数第n+1-k个元素,
利用此规律可以让某个指针先前进k个位置,成为正数第k个元素,那么它距离走完整个链表的剩余的位置数,就是想要达成成为倒数第k个元素的那个元素所需要从第一个位置开始前进的位置数。

实操设计思想:
定义两个指针变量p和q,初始时均指向头结点的下一个结点(链表的第一个结点)
p指针沿着链表移动;当p指针移动到第k个结点时,q指针开始与p指针同步移动。
当p指针移动到最后一个结点时,q指针所指示结点为倒数第k个结点。

以上过程仅对链表进行一次扫描,很高效

步骤:
1.count=0,p和q指向链表表头结点的下一个结点(第一个结点)
2.若p为空,转5
3.若count=k,则q指向下一个结点;否则,count=count+1
4.p指向下一个结点,转2
5.若count等于k,则查找成功,输出该结点的data,返回1;
否则,说明k值超过了线性表的长度,查找失败,返回0
6.算法结束

需要变量:正数工作指针p,倒数工作指针q,位置移动小助手:count

typedef int ElemType;
typedef struct LNode{
  ElemType data;
  struct LNode *link;
  }LNode,*LinkListl
int Search_k(LinkList L,int k){
  LNode*p=L->next,*q=L->next;
  int count=0;
  while(p!=NULL){
      if(count<k)
        count++;
      else
        q=q->next;
      p=p->next;
     }
  if(count<k)//说明提前出现了p=Null的情况,输入的k大于原线性表的长度
    return 0;
  else {//count等于k了
    printf("%d",q->data);
    return 1;
    }
  }

你可能感兴趣的:(小白算法积累)