1.题目描述
已知一个正整数序列,序列元素个数未知,但至少有两个元素,你的任务是建立一个单链表用于存储这个正整数序列。然后实现交换此链表中任意指定的两段,第一段为[s1,t1],第二段[s2,t2]。s1、t1、s2、t2代表链表的第几个节点,且满足s1<=t1,s2<=t2,t1<s2,s2一定小于等于链表节点的总个数。正整数的输入用-1作为结束标志,注意-1不算这个正整数序列中的元素(不要统计-1)。最后将链表的全部节点释放。
2.输入
输入一个正整数序列,以输入“-1”结束,序列中元素个数未知,但输入“-1”前至少输入两个正整数。然后是四个整数,即为s1、t1、s2、t2。
3.输出
经过处理后的新链表,每个元素后有一个空格,注意最后一个元素后只有换行符。
数据最多的测试用例节点数在100这个数量级,所有整数可以用int型存储。
请注意输入输出格式。
4.样例输入
1 2 3 4 5 6 7 8 9 10 -1
1 1 4 7
5.样例输出
The new list is:4 5 6 7 2 3 1 8 9 10
6.思考:
(1)换位问题就是所交换前后节点指针改变
eg:交换a, c:
a b c;
我们假设a前有节点x,让x->next指向c, c->next指向b,b->next指向a,a->next指向最初c->next,这样就实现换位,同理换多个节点也如此
7.完成理想模型所需方法
(1).在头节点前加入cap节点,模拟x对a的作用,然后就是要换的4个节点把握了,大家理会一下代码就行,就不多说了。
#include <stdio.h>
#include <stdlib.h>
typedef struct listNode
{
int a;
struct listNode *next;
} Node;
Node *createNewNode()
{
int b = 0;
Node *newNode = NULL, *tail, *head= NULL;
while (b != -1)
{
scanf("%d", &b);
if (b != -1)
{
newNode = (Node *)malloc(sizeof(Node));
newNode->a = b;
newNode->next = NULL;
tail = head;
if (head == NULL)
{
head = newNode;
}
else
{
while (tail->next)
tail = tail->next;
tail->next = newNode;
tail = tail->next;
}
}
}
return head;
}
int main()
{
int c, s1, t1, s2, t2, i, m;
Node *head, *pre, *end, *pre2, *end2, *demo1, *demo2, *demo, *cap;
head = createNewNode();
cap = (Node *)malloc(sizeof(Node));
cap->next = head;
cap->a = -1;
pre = cap;
pre2 = cap;//pre系列要表示1,3节点之前的节点,所以从cap开始
end = head;
end2 = head;//end系列则表示2,4节点本身
scanf("%d%d%d%d", &s1, &t1, &s2, &t2);
for (i = 0; i < s1; i++)
{
if (i == s1 - 1)
{
for (m =1 ; m < t1; m++)
{
end = end->next;
}
break;
}
pre = pre->next;
}
for (i = 0; i < s2; i++)
{
if (i == s2 - 1)
{
for (m = 1; m < t2; m++)
{
end2 = end2->next;
}
break;
}
pre2 = pre2->next;
}//两个for循环极易bug,我改了很多次,ww
demo1 = pre->next;
pre->next = pre2->next;
demo2 = end2->next;
if(end!=pre2)
{end2->next=end->next;
pre2->next=demo1;
end->next = demo2;}
else{
end2->next=demo1;
end->next=demo2;
}
demo=cap->next;//else这里针对2,3节点相邻的情况
printf("The new list is:");
while (demo)
{
printf("%d ", demo->a);
demo = demo->next;
}//遍历
return 0;
}