简单链表专题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不错的话,麻烦高抬贵手,给小人点点赞。那么我们下期再见。
5万+

被折叠的 条评论
为什么被折叠?



