链表算法题目汇总

题目一:查找倒数第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;
}

    原文作者:远东悟语
    原文地址: https://blog.csdn.net/yuandong0828/article/details/16907009
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞