美文网首页
链表题-求相邻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