数据结构 线性表算法(二)
链表的插入,删除,在原地合并排序链表
// 线性表算法.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 这个文件主要用于实现一些线性表的功能,包括顺序线性表,静态链表,循环链表,双向链表
// 以及一个用链表实现的多项式
// 为了方便和演示算法,顺序线性表直接使用了C++ STL库中的vector
#include "pch.h"
#include <iostream>
using namespace std;
/*
创建两个类,一个表示链表中的节点,有val和next两个变量,一个表示整个链表,保存链表的head指针
*/
class node {
public:
int val;
node *next;
node(int v) {
val = v;
}
node() {
}
};
class linkList {
public:
node *head;
linkList(int v) {
node *h = new node(v);
head = h;
}
linkList() {
head = NULL;
}
/*
为了验证链表的一些算法,需要一个输出链表元素的函数
*/
void printList() {
node *cur = head;
while (cur != NULL) {
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
}
/*
链表长度
*/
int getLen() {
int n = 0;
node *cur = head;
while (cur != NULL) {
cur = cur->next;
n++;
}
return n;
}
/*
为了可以在头部插入,这里的插入我定义为插入在pos位置。
*/
void insert(int pos, int val) {
if (pos == 0) { //插入在头部
node *temp = new node(val);
temp->next = head;
head = temp;
return;
}
node *cur = head;
while (pos - 1 > 0) {
if (cur->next == NULL) // 当pos大于链表的长度,插入在尾部
break;
cur = cur->next;
pos--;
}
node *temp = new node(val);
temp->next = cur->next;
cur->next = temp;
return;
}
/*
如果pos大于链表长度,那么不会删除
*/
void Delete(int pos) {
if (pos == 0) {
if (!head)
return;
head = head->next;
return;
}
node *cur = head;
while (pos - 1 > 0) {
if (cur->next == NULL) {
return;
}
cur = cur->next;
pos--;
}
if (cur->next == NULL) {
cur = NULL;
return;
}
cur->next = cur->next->next;
return;
}
};
/*
合并两个排序链表,保存在l1当中,并且会舍弃掉重复的元素,不需要额外的链表
*/
void merge_sorted_linklist(linkList &l1, linkList &l2) {
node *cur1 = l1.head, *cur2 = l2.head;
// 11 13 15 17 19
// 2 4 6 20
while (cur1 && cur2) {
if (cur1->next == NULL) {
cur1->next = cur2;
return;
}
if (cur1->val < cur2->val) {
if (cur1->next->val > cur2->val) {
node *temp = new node(cur2->val);
cur2 = cur2->next;
temp->next = cur1->next;
cur1->next = temp;
cur1 = cur1->next;
}
else if (cur1->next->val <= cur2->val)
cur1 = cur1->next;
}
else if (cur1->val == cur2->val)
cur2 = cur2->next;
else { //这种情况只可能出现在cur1在head位置时
while (cur2->next->val < cur1->val) {
cur2 = cur2->next;
if (cur2->next == NULL) {
cur2->next = cur1;
cur1 = cur2;
return;
}
}
node *temp = cur2->next;
cur2->next = cur1;
cur2 = temp;
swap(l1.head, l2.head);
}
}
}
int main()
{
linkList l1(11), l2(2);
l1.insert(l1.getLen(), 13);
l1.insert(l1.getLen(), 15);
l1.insert(l1.getLen(), 17);
l1.insert(l1.getLen(), 19);
l1.insert(l1.getLen(), 21);
l1.Delete(l1.getLen() - 1);
l2.insert(l2.getLen(), 4);
l2.insert(l2.getLen(), 6);
l2.insert(l2.getLen(), 20);
l1.printList();
l2.printList();
merge_sorted_linklist(l1, l2);
l1.printList();
l2.printList();
}