前言
最近在学习C++算法与数据结构,利用csdn写一些笔记帮助自己记忆,同时也希望对你们有用。
1.创建简单的链表
代码如下(示例):
struct ListNode {
int val;
ListNode* next;
ListNode(int value, ListNode* next1 = nullptr) //构造函数
{
val = value;
next = next1;
}
};
根据上述代码我们自己定义了一个构造函数,因此可以更加方便的去实现链表的创建。
创建一个单列表:
在这里插入代码片
`
int main()
{
//构造测试链表l1
ListNode* l1 = new ListNode(2);
ListNode* move = l1; //移动指针
move->next = new ListNode(4);
move = move->next;
move->next = new ListNode(3);
move = move->next;
cout << l1->val << endl;
cout << l1->next->val << endl;
cout << l1->next->next->val << endl;
return 0;
}``
输出如下:
2
4
3
上述代码建立了一个简单的单链表l1,下面我们以leetcode上面的一个简单的题目为例,深入了解其功能。
合并两个有序链表
题目如下:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
代码实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* 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 Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//熟悉链表的相关操作
if(l1==nullptr && l2==nullptr)
{
return l1;
}
ListNode* LL=new ListNode(); //创建新链表保存合并后的数据
ListNode* temp=LL; //移动指针
while(l1!=nullptr && l2!=nullptr)
{
if(l1->val > l2->val)
{
temp->val=l2->val;
l2=l2->next;
temp->next=new ListNode();
temp=temp->next;
}
else{
temp->val=l1->val;
l1=l1->next;
temp->next=new ListNode();
temp=temp->next;
}
}
if(l1!=nullptr){
temp->val=l1->val;
l1=l1->next;
while(l1!=nullptr)
{
temp->next=new ListNode();
temp=temp->next;
temp->val=l1->val;
l1=l1->next;
}
}
else if(l2!=nullptr)
{
temp->val=l2->val;
l2=l2->next;
while(l2!=nullptr)
{
temp->next=new ListNode();
temp=temp->next;
temp->val=l2->val;
l2=l2->next;
}
}
return LL;
}
};
此解法略显繁复,想看精简的解法上力扣看大神们的精彩解法。
2.静态链表
静态链表的定义如下:
#define MAXSIZE 100
typedef struct{
ElemType data;
int cur; //指向下一个数据
} SLinkList[MAXSIZE];
下面给出一个例子说明一下:
这样的话我们就可以通过如下操作顺序遍历所有的值。
//核心算法
S[0].data //第一个数
i=S[0].cur;
S[i].data //第二个数
i=S[i].cur
S[i].data //第三个数
。。。 一直循环直到i=0结束
举例:
文件数据.txt中的内容如下:
#include<iostream>
#include <iostream>
#include <fstream>
#define MAXSIZE 10
using namespace std;
typedef struct {
string name;
int cur;
}SLinkList;
int main()
{
SLinkList S[MAXSIZE];
//
string T_name[7];
int T_cur[7];
ifstream myfile("数据.txt");
if (!myfile.is_open())
{
cout << "can not open this file" << endl;
}
for (int i = 0; i < 7; i++)
{
myfile >> T_name[i];
}
for (int j = 7; j < 14; j++)
{
myfile >> T_cur[j - 7];
//cout << "cur" << T_cur[j - 7] << ";[j-7]:" << j - 7 << endl;
}
myfile.close();
for (int i = 0; i < 7; i++)
{
cout << T_name[i] << ":" << T_cur[i] << endl;
}
for (int i = 0; i < 7; i++)
{
S[i].name = T_name[i];
S[i].cur = T_cur[i];
}
//按照顺序输出
int flag = 1;
while (flag != 0)
{
cout << S[flag].name << endl;
flag = S[flag].cur;
}
return 0;
}
结果: