链表基础:问题 D: 实验11_13_链表交换

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;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值