5 条题解

  • 4
    @ 2023-7-28 18:12:41

    嗨嗨!UP来这儿写题解了(雾)


    OK迅速进入正题,这一题是上课那题双向链表的,先看看思路: 分三种情况

    1. 删除节点编号满足 x等于头(删除头)
    2. 删除节点的下一个编号等于-1(删除尾)
    3. 其他的就是删除中间节点

    双向链表的储存相信不用我讲(上了课都懂):

    • 用结构体Node定义
    • 先用 nxtval 来存储下一个节点编号和本节点的值
    • 最后加一个 pre 来表示上一个节点编号
    • head 题目给了为1(先设置上)

    之后就是实现三种情况的处理:

    1. 删除头:只需要将 head 设置为要删除节点的下一个节点编号即可
    2. 删除尾:把要删除节点的上一个节点的下一个节点编号设为-1(就是后面没有节点了)
    3. 删除中间:需要两步:
    • 先把要删除节点 x 的上一个节点的下一个节点的编号设置为要删除节点 x 的下一个节点(简单点思考就是把连通的桥直接通到下一个节点,忽略删除的节点)
    • 这是本题多出的一步,还要把删除节点的下一个的上一个节点更新为删除的节点的上一个节点编号(两端都要连通)

    OK,本题的思路有点绕,可以多琢磨加上核桃编程的课程多想想,然后就上代码(AC code)~~~

    #include <bits/stdc++.h>
    
    using namespace std;
    struct Node
    {
        int val, nxt, pre;
    } node[100005];
    
    int n, m, x, id, head = 1;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cin >> id;
            cin >> node[id].val >> node[id].nxt;
            node[node[id].nxt].pre = id;
        }
        cin >> m;
        for (int i = 1; i <= m; i++)
        {
            cin >> x;
            if (x == head)
                head = node[x].nxt;
            else if (node[x].nxt == -1)
                node[node[x].pre].nxt = -1;
            else
            {
                node[node[x].pre].nxt = node[x].nxt;
                node[node[x].nxt].pre = node[x].pre;
            }
        }
        int now = head;
        while (now != -1)
        {
            cout << node[now].val << ' ';
            now = node[now].nxt;
        }
        return 0;
    }
    

    结束!撒花✿✿ヽ(°▽°)ノ✿~~

    注:ios那两行是cin、cout加速

    • 2
      @ 2023-8-14 13:58:31
      #include <iostream>
      using namespace std;
      int n,m,now,head=1,x,tmp;
      struct Node
      {
          int val,nxt,pre;//以结构体来体现单链表
      }node[100005];
      int main()
      {
          cin>>n;
      
      for(int i=1;i<=n;i++)
      
      
      {
      
          
          int id,val,nxt;
          cin>>id>>val>>nxt;
          node[id].val=val;
          node[id].nxt=nxt;//输入单链表
          node[node[id].nxt].pre=id;
      }
      cin>>m;
      for(int i=1;i<=m;i++)
      {
          cin>>x;
          if(x==head)
              head=node[head].nxt;    
          else if(node[x].nxt==-1)
              node[node[x].pre].nxt=-1;
          else
              node[node[x].pre].nxt=node[x].nxt;
              node[node[x].nxt].pre=node[x].pre;
          now=node[now].nxt;
      }//删除元素
      now=head;
      while(now!=-1)
      {
          cout<<node[now].val<<" ";
          now=node[now].nxt;
      }//输出删除后的链表
      return 0;
      }
      
      • -2
        @ 2023-3-26 15:43:33
        cin>>m;
        for (int i=1;i<=m;i++)//删除链表项
        {
            cin>>x;
            if (x==h)
            {
                h=a[x].next;
            }
            else if (a[x].next==-1)
            {
                a[a[x].y].next=-1;
            }
            else
            {
                a[a[x].y].next=a[x].next;
                a[a[x].next].y=a[x].y;
            }
        }
        
        • -3
          @ 2022-5-4 12:20:23

          #include <iostream>

          using namespace std;

          int n,m,now,head=1,x,tmp;

          struct Node

          {

          int val,nxt,pre;//以结构体来体现单链表
          

          }node[100005];

          int main()

          {

          cin>>n;
          
          for(int i=1;i<=n;i++)
          
          
          {
          
              
              int id,val,nxt;
              cin>>id>>val>>nxt;
              node[id].val=val;
              node[id].nxt=nxt;//输入单链表
              node[node[id].nxt].pre=id;
          }
          cin>>m;
          for(int i=1;i<=m;i++)
          {
              cin>>x;
              if(x==head)
                  head=node[head].nxt;    
              else if(node[x].nxt==-1)
                  node[node[x].pre].nxt=-1;
              else
                  node[node[x].pre].nxt=node[x].nxt;
                  node[node[x].nxt].pre=node[x].pre;
              now=node[now].nxt;
          }//删除元素
          now=head;
          while(now!=-1)
          {
              cout<<node[now].val<<" ";
              now=node[now].nxt;
          }//输出删除后的链表
          return 0;
          

          }

          • @ 2023-5-27 16:59:13

            合成一下

            #include <iostream>
            using namespace std;
            int n,m,now,head=1,x,tmp;
            struct Node
            {
                int val,nxt,pre;//以结构体来体现单链表
            }node[100005];
            int main()
            {
                cin>>n;
            
            for(int i=1;i<=n;i++)
            
            
            {
            
                
                int id,val,nxt;
                cin>>id>>val>>nxt;
                node[id].val=val;
                node[id].nxt=nxt;//输入单链表
                node[node[id].nxt].pre=id;
            }
            cin>>m;
            for(int i=1;i<=m;i++)
            {
                cin>>x;
                if(x==head)
                    head=node[head].nxt;    
                else if(node[x].nxt==-1)
                    node[node[x].pre].nxt=-1;
                else
                    node[node[x].pre].nxt=node[x].nxt;
                    node[node[x].nxt].pre=node[x].pre;
                now=node[now].nxt;
            }//删除元素
            now=head;
            while(now!=-1)
            {
                cout<<node[now].val<<" ";
                now=node[now].nxt;
            }//输出删除后的链表
            return 0;
            }
            
        • -7
          @ 2022-4-24 16:51:29

          写题解请注意

          鼓励大家写题解,但注意题解格式。

          题解一定要有思路解析或代码注释,能否让别人理解你的思路

          也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

          给代码两端加上这个会舒服一些

          ```cpp

          你的代码

          ```

          </span>

          这个点在键盘的左上角tab上面那个键,注意切换输入法

          #include<iostream>
          using namespace std;
          int main()
          {
              int n;
              cin>>n;//这是一个注释
              return 0;
          } 
          

          请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

          抄袭题解一经发现直接取消成绩。

          题解被删除的可能

          1. 代码不符合格式规范
          2. 没有思路讲解或者没有注释,
          3. 无意义的题解

          大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

          • 1

          链表的应用_链表删除M个节点

          信息

          ID
          1419
          时间
          1000ms
          内存
          128MiB
          难度
          4
          标签
          递交数
          220
          已通过
          104
          上传者