单链表最大值移动

题目描述

【问题描述】
已知非空线性链表第1个链结点指针为list,链结点构造为
struct node{
    datatype data;
    node *link;
};
请写一算法,将该链表中数据域值最大的那个点移到链表的最后面。(假设链表中数据域值最大的链结点惟一)(注意:要求先写出算法的解题思路,然后再写出算法)
【输入形式】
输入为一个整数序列,整数之间以空格隔开,序列以回车结尾,输入-1结束(假设链表中吴数据-1)。
【输出形式】
输出为移动后的整数序列,整数之间以空格隔开,序列以回车结尾。
【样例输入】
3 12 4 9 5 1 -1
【样例输出】
3 4 9 5 1 12


解题思路

        法一 解题思路:首先遍历链表,找到最大的那个点然后删除记录最大添加到末尾;法二解题思路:对法一优化首先遍历链表,找到最大结点并记录最大的前一结点,然后改变指针指向。


源代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef int datatype;

typedef struct node {
    datatype data;
    node* link;
}LinkNode;

//初始化链表
void InitList(LinkNode*& L) {
	L = (LinkNode*)malloc(sizeof(LinkNode));
	L->link = NULL;
}
//销毁
void DestroyList(LinkNode*& L) {
	LinkNode* pre = L, * p = pre->link;
	while (p != NULL) {
		free(pre);
		pre = p;
		p = p->link;
	}
	free(pre);
}
//输出链表
void DispList(LinkNode* L) {
	LinkNode* p = L->link;
	while (p != NULL) {
		cout << p->data << " ";
		p = p->link;
	}
	cout << endl;
}
//法一   解题思路:首先遍历链表,找到最大的那个点然后删除记录最大添加到末尾:
/*//删除最大结点
void Delmax(LinkNode*& L, int a) {
	LinkNode* p = L->link, * pre = L;
	while (p != NULL) {
		if (p->data == a) {
			pre->link = p->link;
			free(p);
			p = pre->link;
		}
		else {
			pre = p;
			p = p->link;
		}
	}
}
void MovemaxNode(LinkNode*& L) {
	LinkNode* p = L->link->link;
	int ma = L->link->data;
	while (p) {
		if (p->data > ma)
			ma = p->data;
		p = p->link;
	}
	Delmax(L, ma);
	p = L->link;
	while (p->link) {
		p = p->link;
	}
	LinkNode* s;
	s = (LinkNode*)malloc(sizeof(LinkNode));
	p->link = s;
	s->data = ma;
	s->link = NULL;
}*/
//法二   解题思路:对法一优化首先遍历链表,找到最大结点并记录最大的前一结点,然后改变指针指向:
void MovemaxNode(LinkNode*& L) {
	//分别是当前结点,最大结点,最大结点的前一结点,当前结点的上一结点
	LinkNode* p = L->link->link, * maxnode = L->link, * maxprenode = L, *pre = L->link;
	while (p) {
		if (p->data > maxnode->data) {
			maxnode = p;
			maxprenode = pre;
		}
		p = p->link;
		pre = pre->link;
		if (p->link == NULL) {
			maxprenode->link = maxnode->link;
			p->link = maxnode;
			maxnode->link = NULL;
			break;
		}
	}
 }



//尾插法,整体创建链表
void CreateListR(LinkNode*& L, datatype* a, int n) {
	LinkNode* s, * tc;
	int i;
	L = (LinkNode*)malloc(sizeof(LinkNode));
	tc = L;
	for (i = 0; i < n; i++) {
		s = (LinkNode*)malloc(sizeof(LinkNode));
		s->data = a[i];
		tc->link = s;
		tc = s;
	}
	tc->link = NULL;
}
int main() {
	LinkNode* L;
	int i = 0, arr[100], x;
	InitList(L);
	while (1) {
		cin >> x;
		if (x == -1)
			break;
		arr[i++] = x;
	}
	CreateListR(L, arr, i);
	MovemaxNode(L);
	DispList(L);
}

总结

        链表类的简单题但一次遍历考察技巧性~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想我记得写信

您的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值