简单链表专题1

简单链表专题1

这次我们来谈一下链表有关的简单操作
1.单,双链表的翻转
2.合并两个有序链表

1.单,双链表的翻转

对于链表的组成结构和链表的建立我这里就不详细的叙述了。就直接讲述单双链表的翻转操作了

1.1单链表翻转

我们先从例子入手,假设存在一个链表1->2->3->4->5->nullptr.那么我们如何将其翻转呢。其实很简单。我们先定义两个指针next=pre=nullptr.然后让next指向head的下一个节点。即next=head->next.然后让head->next=pre,也就是改变了链表的指向方向然后,pre要跳到head的位置。即pre=head.,下一步head跳到下一个节点的位置,因为我们事先保留了下一个节点的位置,所以说直接让head=next就行了。重复操作 直到head==nullptr为止。具体细节同学们可以画图来理解
下面我们看一下code

class ListNode {
public:
	int val;
	ListNode* next;
	ListNode() : val(0), next(nullptr) {}
	ListNode(int x) : val(x), next(nullptr) {}
	ListNode(int x, ListNode* next) : val(x), next(next) {}
	
};
//翻转单链表

class Solution1
{
public:
	ListNode* reverseList(ListNode* head)
	{
		ListNode* pre = nullptr;
		ListNode* next = nullptr;
		while (head != nullptr)
		{
			next = head->next;
			head->next = pre;
			pre = head;
			head = next;
		}
		return pre;
	}
};

2.双链表翻转

双链表的翻转与单链表的翻转类似,只不过指针域由一个指针变成了两个指针罢了,同学们可以尝试画一下,理一下思路。这里我就不过多阐述了。就直接上code了

//翻转双链表
class DoubleListNode
{
public:
	int val;
	DoubleListNode* last;
	DoubleListNode* next;
};
class Solution2
{
public:
	DoubleListNode* reverseList(DoubleListNode* head)
	{
		DoubleListNode* pre = nullptr;
		DoubleListNode* next = nullptr;
		while (head != nullptr)
		{
			next = head->next;
			head->next = pre;
			head->last = next;
			pre = head;
			head = next;
		}
		return pre;
	}
};

注意我这里的双链表的构造函数没有写,同学们可以自己写上。

2.合并两个有序链表

其实合并两个有序链表的思路很简单。举个例子:例如一个链表是1->3->5,
另一个链表是2->4->6。我们可以这样想:先取两个链表中头最小的那个,也就是1,然后拿1之后的数字3与另一个链表的头2比,操作后得到了1->2,按照这种思路最终得到有序链表1->2->3->4->5->6。这种做法其实在归并排序中也有着重要的应用。到后边我会写一篇“基础排序算法”的blog。那时会再次提到的。下面我们看一下code

//合并两个有序链表
class Solution3
{
public:
	ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
		//特判一下
		if (list1 == nullptr)
			return list2;
		if (list2 == nullptr)
			return list1;
		ListNode* head = list1->val <= list2->val ? list1 : list2;
		ListNode* cur1 = head->next;
		ListNode* pre = head;
		ListNode* cur2 = head == list1 ? list2 : list1;
		while (cur1 != nullptr && cur2 != nullptr)
		{
			if (cur1->val <= cur2->val)
			{
				pre->next = cur1;
				cur1 = cur1->next;
			}
			else
			{
				pre->next = cur2;
				cur2 = cur2->next;
			}
			pre = pre->next;
		}
		if (cur1 == nullptr)
			pre->next = cur2;
		else
			pre->next = cur1;
		return head;
	}
};

总结一下:链表的题目需要多多画图理解,只要图画出来了,代码就好写了。所以大家要多画一画。

今天就先说到这里,后面还会有一个"简单链表专题2“和一个链表强化。如果各位看官老爷觉得这篇blog不错的话,麻烦高抬贵手,给小人点点赞。那么我们下期再见。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值