链表算法题目汇总

来源:互联网 发布:淘宝运营推广培训 编辑:程序博客网 时间:2024/06/06 11:46

题目一:查找倒数第K个结点

.已知一个带有表头结点的单链表,结点结构为:datalink

假设该链表只给出了头指针list,在不改变链表前提下,请设计一个尽可能高效的算法,查找链表中导数第K个位置上的结点(K为正整数)。若查找成功,算法输出为该节点的data域的值,并返回1,;否则,只返回0.要求:

  1. 描述算法的基本设计思想;
  2. 描述算法的详细实现步骤;
  3. 根据设计思想和实现步骤,采用程序设计语言描述算法,关键之处请给出简要注释。

解答:

  1. 基本设计思想:定义两个指针p,q,初始时均指向头结点的下一个结点,及链表的头结点。p指针沿着链表移动,当p指向第k个结点时,q指针开始与p指针同步移动,当p指针移动到最后一个节点时,q指针所指示的结点导数第k个结点。以上过程对链表进进行一遍扫描。
  2. 基本步骤略写。
  3. 算法实现代码如下:codeblocks12.11+gcc
    //查找倒数第K个结点typedef int ElemType;typedef struct LNode{    ElemType data;    struct LNode *link;}*LinkList;int search_k(LinkList listHead ,int k){    LinkList p = listHead ->link, q = listHead -> link ;//指针平,q指向第一个结点    int count = 0;    while(p != NULL)    {        if(count < k) count ++;        else q= q -> link;        p = p -> link;    }    if (count < k)    {        return 0;    }    else    {        printf("%d\n",  q->data);        return 1;    }}

题目二:单链表逆转

题目:已知一个带有头结点的单链表,设计一个高效算法实现该单链表的逆转算法。

解答:

  1. 算法说明:略
  2. 算法实现代码:
    LinkList linkReverse(LinkList listHead){    if(listHead == NULL || listHead-> link == NULL)    {       return listHead;   /*链表为空,直接返回*/    }    LinkList tmp = NULL,             pre = NULL,             cur = listHead -> link;    while(cur  != NULL)    {      tmp = cur-> link;      cur-> link  = pre;      pre = cur;      cur = tmp;    }    listHead ->link = pre;    return listHead;}


总的代码:

运行环境codeblocks12.11 +gcc

#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct LNode{    ElemType data;    struct LNode *link;}*LinkList;/*查找倒数第K个结点*/int search_k(LinkList listHead ,int k){    LinkList p = listHead ->link, q = listHead -> link ;//指针平,q指向第一个结点    int count = 0;    while(p != NULL)    {        if(count < k) count ++;        else q= q -> link;        p = p -> link;    }    if (count < k)    {        return 0;    }    else    {        printf("%d\n",  q->data);        return 1;    }}/*  链表逆转 */LinkList linkReverse(LinkList listHead){    if(listHead == NULL || listHead-> link == NULL)    {       return listHead;   /*链表为空,直接返回*/    }    LinkList tmp = NULL,             pre = NULL,             cur = listHead -> link;    while(cur  != NULL)    {      tmp = cur-> link;      cur-> link  = pre;      pre = cur;      cur = tmp;    }    listHead ->link = pre;    return listHead;}int main(){    LinkList listNode[10];    int i =0 ;    for(;i < 10 ;i++){        listNode[i] =  (LinkList) malloc( sizeof(struct LNode) );        listNode[i]->data = i;        if (i == 0){            listNode[i] -> link =  NULL;        }else{            listNode[i] -> link = listNode[i-1];        }    }    LinkList ListHead  =  (LinkList) malloc( sizeof(struct LNode) );    ListHead -> link = listNode[9];    LinkList tmp =  ListHead -> link ;    while(tmp != NULL){        printf("%d\t", tmp -> data);        tmp = tmp -> link;    }    printf("\n");    linkReverse(ListHead);    tmp =  ListHead -> link ;    while(tmp != NULL){        printf("%d\t", tmp -> data);        tmp = tmp -> link;    }    printf("\n");     search_k(ListHead, 1);     return 1;}