算法和数据结构之——对链表进行插入排序

插入排序一般分为两种,对数组进行插入排序和对链表进行插入排序,对数组进行插入排序比较简单,其代码如下:

//对数组进行插入排序
void insertSort(vector<int> nums){
	for (int i = 0; i < nums.size(); i++){
		for (int j = i; j>0; j--){
			if (nums[j] < nums[j - 1]){
				int temp = nums[j];
				nums[j] = nums[j - 1];
				nums[j - 1] = temp;
			}
			else{
				break;
			}
		}
	}
	for (vector<int>::iterator itr = nums.begin(); itr != nums.end(); itr++){
		cout << *itr << ' ';
	}
}

以下主要讨论第二种,其代码如下:

//对链表进行插入排序
class Solution {
public:
	ListNode* insertionSortList(ListNode* head) {
		if (!head || !head->next)
			return head;
		ListNode *dummyhead = new ListNode(-1);//伪头指针
		dummyhead->next = head;//head始终指向排序前第一个元素
		ListNode *prev = head;
		ListNode *node = head->next;
		while (node)
		{//if语句为了判断元素是否要插入到前面
			if (node->val < prev->val)
			{
				ListNode* temp = dummyhead;
				//while循环是为了判断元素的位置
				while (temp->next->val < node->val)
				{
					temp = temp->next;//指针后移
				}
				prev->next = node->next;
				node->next = temp->next;
				temp->next = node;
				node = prev->next;
			}
			else
			{
				prev = prev->next;
				node = node->next;
			}
		}
		return dummyhead->next;//返回新链表首元素
	}
};

我们以链表 9->6->8->7为例对上图的代码进行分析,如下图所示,有几个点需要注意的地方:
1.prev指针始终指向排序前首部元素,即9;
2.head指针始终指向排序前首部元素,即9,可以看出head和prev的作用一样,故而有些重复,所以我们可以把上面的代码中prev部分删去,只用head表示即可(如下)。
3.node指针每次向后移动一位,直到node=NULL跳出循环;
4.temp指针是为了找到node结点的插入位置。如果比dummyhead->next所指向的元素大,则temp指针向后移动。

//对链表进行插入排序
class Solution {
public:
	ListNode* insertionSortList(ListNode* head) {
		if (!head || !head->next)
			return head;
		ListNode *dummyhead = new ListNode(-1);//伪头指针
		dummyhead->next = head;//head始终指向排序前第一个元素
		ListNode *node = head->next;
		while (node)
		{//if语句为了判断元素是否要插入到前面
			if (node->val < head->val)
			{
				ListNode* temp = dummyhead;
				//while循环是为了判断元素的位置
				while (temp->next->val < node->val)
				{
					temp = temp->next;//指针后移
				}
				head->next = node->next;
				node->next = temp->next;
				temp->next = node;
				node = head->next;
			}
			else
			{
				head = head->next;
				node = node->next;
			}
		}
		return dummyhead->next;//返回新链表首元素
	}
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值