正序链表
#include<iostream>
using namespace std;
struct Node
{
int val;
Node* next;
};
int main()
{
Node* head, * s, * p;
head = s = p = NULL;
s = new Node;
scanf("%d", &s->val);
while (s->val)
{
if (head == NULL)
{
head = s;
s->next = NULL;
}
else
{
p->next = s;
}
p = s;
s = new Node;
scanf("%d", &s->val);
}
p->next = NULL;///结尾赋空值
while (head)
{
printf("%d", head->val);
head = head->next;
}
return 0;
}
逆序链表
#include<iostream>
using namespace std;
struct Node
{
int val;
Node* next;
};
int main()
{
Node* head, * s, * p;
head = s = p = NULL;
s = new Node;
scanf("%d", &s->val);
while (s->val)
{
if (head == NULL)
{
head = s;
s->next = NULL;///结尾赋空值
}
else
{
s->next = p;
}
p = s;
s = new Node;
scanf("%d", &s->val);
}
while (p)
{
printf("%d ", p->val);
p = p->next;
}
}
有序链表(正序)
#include<iostream>
using namespace std;
struct Node
{
int val;
Node* next;
};
int main()
{
Node* head, * p, * s, * q;
head = s = p = q = NULL;
s = new Node;
scanf("%d", &s->val);
while (s->val)
{
if (head == NULL)
{
head = s;
s->next = NULL;
}
else
{
if (s->val <= head->val)
{
s->next = head;
head = s;
}
else
{
bool temp = 1;
for (q = head, p = head->next;p;q = p, p = p->next)
{
if (s->val <= p->val)
{
s->next = p;
q->next = s;
temp = 0;
break;
}
}
if (temp)///判定是否没有大于s->val的值
{
q->next = s;
s->next = NULL;
}
}
}
s = new Node;
scanf("%d", &s->val);
}
Node* f = head;
while (f)
{
printf("%d ", f->val);
f = f->next;
}
return 0;
}
有序链表的合并
#include<iostream>
using namespace std;
struct Node
{
int val;
Node* next;
};
int main()
{
int N;
scanf("%d", &N);///有N个链表需要整合
Node* head1, * p1, * s1, * q1;///总的链表
head1 = s1 = p1 = q1 = NULL;
while (N--)
{
Node* head, * p, * s, * q;
head = s = p = q = NULL;
s = new Node;
s1 = new Node;///开辟空间
scanf("%d", &s->val);
s1->val = s->val;///储存值
while (s->val)
{
if (head == NULL)
{
head = s;
s->next = NULL;
}
else
{
if (s->val <= head->val)
{
s->next = head;
head = s;
}
else if (s->val > head->val)
{
bool temp = 1;
for (q = head, p = head->next;p;q = p, p = p->next)
{
if (s->val <= p->val)
{
s->next = p;
q->next = s;
temp = 0;
break;
}
}
if (temp)
{
q->next = s;
s->next = NULL;
}
}
}
/// <summary>
///
/// </summary>
/// <returns></returns>
/// 以下是总的链表的创建
if (head1 == NULL)
{
head1 = s1;
s1->next = NULL;
}
else
{
if (s1->val <= head1->val)
{
s1->next = head1;
head1 = s1;
}
else if (s1->val > head1->val)
{
bool temp = 1;
for (q1 = head1, p1 = head1->next;p1;q1 = p1, p1 = p1->next)
{
if (s1->val <= p1->val)
{
s1->next = p1;
q1->next = s1;
temp = 0;
break;
}
}
if (temp)
{
q1->next = s1;
s1->next = NULL;
}
}
}
s = new Node;
s1 = new Node;///开辟空间
scanf("%d", &s->val);
s1->val = s->val;///储存值
}
Node* t = head;
while (t)
{
printf("%d ", t->val);
t = t->next;
}
printf("\n");
}
Node* t1 = head1;
while (t1)
{
printf("%d ", t1->val);
t1 = t1->next;
}
return 0;
}
环形链表
题目:n个人围成一圈,游戏从第k个人开始,从1到interval不断报数,报到interval的人出列,直到环空为止。出列的人按先后顺序构成一个新的序列,输出该序列。
#include<iostream>
using namespace std;
struct Node
{
int val;
Node* next;
};
int main()
{
int N;
scanf("%d", &N);
Node* head, * s, * p, * q;
head = new Node;
s = head;
for (int i = 1;i <= N;i++)
{
s->val = i;
if (i < N)
{
s->next = new Node;
s = s->next;
}
}
s->next = head;
for (p = head;p->next != head;p = p->next);///将指针p移置末端
int k, interval;
scanf("%d%d", &k, &interval);
for (q = head, q->next != q;p->next = q;p = q, q = q->next)///将指针p和q移动到相应位置
{
if (k == 1)break;
k--;
}
int res = 0;
for (q->next != q;p->next = q;)
{
res++;
if (res % interval == 0)
{
printf("%d ", q->val);
p->next = q->next;
delete q;
q = NULL;
q = p->next;
}
else
{
p = q;
q = q->next;
}
}
return 0;
}