1.基础增删改查
#include<iostream>
using namespace std;
typedef struct node
{
int data;
node* next;
}node;
void print(node* root)
{
node* point = root;
while (point)
{
cout << point->data <<"->";
point = point->next;
}
cout << endl;
}
void frontsert(node** root,int x)
{
node* point = new node;
point->data = x;
point->next = *root;
*root = point;
}
void backsert(node** root, int x)
{
node* point1 = new node;
point1->data = x;
point1->next = nullptr;
if (*root == nullptr)
{
*root = point1;
return;
}
node* point = *root;
while (point->next)
{
point = point->next;
}
point->next = point1;
}
void backlose(node** root)
{
if (*root == nullptr)
{
return;
}
if ((*root)->next == nullptr)
{
free(root);
}
node* point = *root;
node* pre = nullptr;
while (point->next)
{
pre = point;
point = point->next;
}
point = nullptr;
pre->next = nullptr;
}
void frontlose(node**root)
{
if (root == nullptr)
{
return;
}
if ((*root)->next == nullptr)
{
free(root);
return;
}
(*root) = (*root)->next;
}
int main()
{
node* root = nullptr;
frontsert(&root, 1);
frontsert(&root, 2);
frontsert(&root, 3);
print(root);
node* root1 = nullptr;
backsert(&root1, 1);
backsert(&root1, 2);
backsert(&root1, 3);
print(root1);
backlose(&root);
print(root);
frontlose(&root1);
print(root1);
return 0;
}
2.双指针的典型应用:链表合并
#include<iostream>
using namespace std;
typedef struct node
{
int data;
node* next;
}node;
void print(node* root)
{
node* point = root;
while (point)
{
cout << point->data <<"->";
point = point->next;
}
cout << endl;
}
void frontsert(node** root,int x)
{
node* point = new node;
point->data = x;
point->next = *root;
*root = point;
}
void backsert(node** root, int x)
{
node* point1 = new node;
point1->data = x;
point1->next = nullptr;
if (*root == nullptr)
{
*root = point1;
return;
}
node* point = *root;
while (point->next)
{
point = point->next;
}
point->next = point1;
}
void backlose(node** root)
{
if (*root == nullptr)
{
return;
}
if ((*root)->next == nullptr)
{
free(root);
}
node* point = *root;
node* pre = nullptr;
while (point->next)
{
pre = point;
point = point->next;
}
point = nullptr;
pre->next = nullptr;
}
void frontlose(node**root)
{
if (root == nullptr)
{
return;
}
if ((*root)->next == nullptr)
{
free(root);
return;
}
(*root) = (*root)->next;
}
node* creat(node*root,node*root1)
{
if (!root)
{
return root1;
}
if (!root1)
{
return root;
}
node* point = nullptr;
node* point1 = point;
while (root && root1)
{
if (root->data <= root1->data)
{
if (point == nullptr)
{
point = root;
point1 = point;
}
else
{
point->next = root;
point = point->next;
}
root = root->next;
}
else
{
if (point == nullptr)
{
point = root1;
point1 = point;
}
else
{
point->next = root1;
point = point->next;
}
root1 = root1->next;
}
}
if (root)
{
point->next = root;
}
if (root1)
{
point->next = root1;
}
return point1;
}
int main()
{
node* root = nullptr;
backsert(&root, 1);
backsert(&root, 4);
backsert(&root, 6);
print(root);
node* root1 = nullptr;
backsert(&root1, 2);
backsert(&root1, 3);
backsert(&root1, 3);
print(root1);
node* root2=creat(root, root1);
print(root2);
return 0;
}
3.环形链表的约瑟夫环问题
#include<iostream>
using namespace std;
typedef struct node
{
int data;
node* next;
}node;
node* creat(int n)
{
node* head = new node;
node* point = head;
for (int i = 1; i <= n; i++)
{
point->data = i;
if (i < n)
{
point->next = new node;
point = point->next;
}
else
{
point->next = head;
}
}
}
int row(int n, int m)
{
node* head = creat(n);
node* cur = head;
node* prev = nullptr;
while (cur->next != cur)
{
for (int count = 1; count < m; count++)
{
prev = cur;
cur = cur->next;
if (cur == nullptr)
{
break;
}
}
if (cur == nullptr)
{
break;
}
prev->next = cur->next;
delete cur;
cur = prev->next;
}
return cur->data;
}
int main()
{
int n;
int m;
cin >> n >> m;
int win = row(n, m);
cout << win;
return 0;
}