美文网首页
链表题-求相邻k个节点数值之和最大的第一节点

链表题-求相邻k个节点数值之和最大的第一节点

作者: ios周周 | 来源:发表于2019-09-28 23:09 被阅读0次

    输入数据(设为整型)建立单链表,并求相邻k个节点data值之和为最大的第一节点。例如输入k = 2,数据为2 6 4 7 3 #(#为结束符),建立下面链表,运行结果输出(序号3,data值4):

    具体思想:

    写个计算链表长度的函数,以判断k的值是否合法。

    从头结点开始遍历leng-k+1次,因超过这个次数则后面要相加的结点已不足k个。从每个遍历到的结点开始计算当前k个节点的和(sum),如果比前面k个节点的sum更大,则保存新的sum值,并且保存此时指向此节点的指针为result。当leng-k+1次遍历完,则最大值sum出来了,此时的result便是要求的结果。

    以下是具体代码实现。

    基本数据定义

    typedef int ElementType;

    typedef struct LNode{

        ElementType data;

        structLNode*next;

    }LNode,*LinkList;

    #define LENG sizeof(LNode)

    LinkList creatHeadLinkList(LNode*head,ElementTypee) //相当于CreateList(L)

    {

        LinkList list = head;

        if(!list) {

            LNode*headNew =(LNode*)malloc(LENG);

            LNode*node1 =(LNode*)malloc(LENG);

            node1->data= e;

            node1->next=NULL;

            headNew ->next= node1;

            list = headNew;

            return list;

        }

        LNode*p = list->next;//后指针

        while(p->next!=NULL) {

            p = p->next;

        }

        LNode*new = (LNode*)malloc(LENG);

        new->data= e;

        new->next=NULL;

        p->next= new;

        printHeadLinkList(list);

        return list;

    }

    void printHeadLinkList(LinkList list)

    {

        LNode*head = list;

        while(head->next) {

            printf("data=%d\r\n",head->next->data);

            head = head ->next;

        }

    }

    int getHasHeadListLeng(LinkList list) //获取有头结点的链表的长度

    {

        int length =0;

        LNode*temp = list->next;

        while(temp !=NULL) {

            length++;

            temp = temp->next;

        }

        return length;

    }

    int Adjmax(LinkList list,int k)//获取链表前k个结点的和

    {

        if(list==NULL) {

            return0;

        }

        int sum =0;

        int times =0;

        LNode*temp = list;

        while(temp !=NULL&&times<k

            sum += temp->data;

            temp = temp->next;

            times ++;

        }

        return sum;

    }

    LNode*firstNodeinMaxk(LinkList list,int k)//求相邻k个节点数值之和最大的首节点

    {

        if(list==NULL||list->next==NULL) {

            returnlist;

        }

        int len = getHasHeadListLeng(list);

        if(k>=len) {

            return list;

        }

        int times = len - k +1;

        LNode*temp = list->next;

        int i =0;

        LNode*result;

        int maxKSum=0;

        while(temp !=NULL&&i<times)

            intsum =Adjmax(temp, k);

            if(sum>maxKSum) {

                maxKSum = sum;

                result = temp;

            }

            temp = temp->next;

            i++;

        }

        printf("result=%d",result->data);

        return result;

    }

    相关文章

      网友评论

          本文标题:链表题-求相邻k个节点数值之和最大的第一节点

          本文链接:https://www.haomeiwen.com/subject/galjyctx.html