zoukankan      html  css  js  c++  java
  • 反转链表(欠反转地球的债)

    反转链表

    github链接

    题目在此

    解题思路

    当年没写的反转地球还是要补,跑不掉啊。

    输入部分:用结构体数组存。

    创建链表:先建立一个只有首个元素的链表,再一个一个插入节点。插入时用指针从数组头往后找。直到-1结束。

    反转链表:用四个指针p(依次往后移动),p1(需要反转的节点),p2(反转的节点将到达位置的后一个节点),p3(反转的节点将到达位置的前一个节点),这样k个节点反转时,开始p指向第一个,p1=p->Next;然后把p1取出(p->Next=p1->Next),然后用p3,p2确定p1将到达位置(p1->Next=p2,p3->Next=p1),注意第一次反转头指针在变,因为没有头节点,还有四个指针的移动。详情参看代码。

    输出部分:因为地址五位数,一开始用int存地址,输出补全。

    完善思路

    当然,打代码的道路总是不平坦的。

    跳过代码不成形环节。讲能反转之后的情况。

    一开始忽略了反转以后对应的地址也要跟着改变,这时候只要在每次改变链表顺序时,相应的next也改下就好了。例如:p->Next=p1->Next,这时候要跟上一句:p->next=p1->next。(大写Next为指针,小写next为下个地址)。

    跑去提交发现第五个测试点超时了,检查觉得创建链表很麻烦,每次都要把数组找一遍。在队长提示下用了数组下标。将下标用他们首地址表示,这样创建的时候,直接找下标为当前结点的next就好了。依旧-1停止。但是因为不是所有节点有效,所以用num记录。

    提交截图

    代码专区

    输入部分

    for (i = 0; i<n; i++)
    {
    	scanf("%d%d%d", &t1, &t2, &t3);
    	node[t1].address = t1;
    	node[t1].date = t2;
    	node[t1].next = t3;
    }
    

    创建链表函数

    Node *create(int first)//创建链表
    {
        Node*head, *p1, *p2;
        p1 = &node[first];
        head = p1;
        num++;
        while (p1->next != -1)
        {
            p2 = p1;
            p1 = &node[p1->next];
            p2->Next = p1;
            num++;
        }
        p1->Next = NULL;
        return head;
    }
    

    反转链表函数

      Node *reverse(Node *head, int k, int num)
      {
          Node *p;
          Node *p1, *p2, *p3;//p1需要反转的点,p2反转点插入位置后面一个点,p3反转点插入位置的前一个点
          int i;
    
          p = p1 = p3 = head;
          p2 = p;
    
          for (i = 0; i < num; i++)
          {
              int j = 1;
              while (j != k)
              {
                  p1 = p->Next;
                  p->Next = p1->Next;
                  p->next = p1->next;
    
                  if (i == 0)
                  {
                      head = p1;
                      p1->Next = p2;
                      p1->next = p2->address;
                      p2 = p1;
    
                  }
                  else
                  {
                      p3->Next = p1;
                      p3->next = p1->address;
                      p1->Next = p2;
                      p1->next = p2->address;
                      p2 = p1;
                  }
                  j++;
              }
              p3 = p;
              p = p->Next;
              p2 = p;
    
          }
          return head;
      }
    

    the last

    第一次写了卡死电脑的程序,还是蛮开心的。

  • 相关阅读:
    IBatisNet不常用到的配置(Dao.config ConnectionTimeout),居然不起作用(前辈留给我们的坑)
    随机数 字母 数字
    证书文件(pfx)读取时报 “指定的网络密码不正确”
    SQL多结果集导出Excel
    Uva514
    PAT乙级1012
    栈-41
    位运算-89
    PAT乙级1028
    PAT乙级1029
  • 原文地址:https://www.cnblogs.com/liu424/p/5518482.html
Copyright © 2011-2022 走看看