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

输入数据(设为整型)建立单链表,并求相邻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;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容