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