(单链表)单链表的整体逆序和局部逆序

  • 题目一:将单链表翻转。
  • 思路:有三种方式。
    • 一:用数组存储单链表的值,然后重新逆序赋值,效率较低。
    • 二:利用三个指针,在原来的基础上进行逆序。这种方法比较实用,效率也高。
    • 三:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。需要新建一个链表,这种方法和第二种差不多。
    • 这里我就写出第二种方法,比较实用。
  • 代码(方法二):

    struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    ListNode *ReverseList(ListNode *head){
        ListNode *pre, *cur, *net;//前驱,中间,后继节点。
        pre = head;
        cur = pre->next;
        while (cur){
            net = cur->next;
            cur->next = pre;
            pre = cur;
            cur = net;
        }
        //这里翻转完成之后起初的头结点就是尾节点了。所以
        head->next = NULL;
        *head = p1;
        return head;
    }
  • 问题二;

    给定链接列表,每次颠倒链表k的节点并返回其修改的列表。
    
    如果节点的数量不是k的倍数,则最后的左出节点应该保持原样。
    
    您不能更改节点中的值,只有节点本身可能会更改。
    
    只允许常量存储器。
    
    例如,
    给定这个链表:1-> 2-> 3-> 4-> 5
    
    对于k = 2,您应该返回:2-> 1-> 4-> 3-> 5
    
    对于k = 3,您应该返回:3-> 2-> 1-> 4-> 5
    •   解题思路:这里实用了常量数组存储链表的值,然后进行局部链表的翻转,利用reverse函数进行翻转。
    •   代码

      /**
       * Definition for singly-linked list.
       * struct ListNode {
       *     int val;
       *     ListNode *next;
       *     ListNode(int x) : val(x), next(NULL) {}
       * };
       */
      class Solution {
      public:
          ListNode *reverseKGroup(ListNode *head, int k) {
              if (!head)
                  return head;
              if (k == 1)
                  return head;
              vector<int> res;
              ListNode *temp = head;
              ListNode *newhead = head;
              while (temp){
                  res.push_back(temp->val);
                  temp = temp->next;
              }
      
              for (int i=0; i+k<=res.size(); i+=k){
                  reverse(res.begin()+i, res.begin()+i+k);
              }
      
              for (int i=0; i<res.size(); i++){
                  newhead->val = res[i];
                  newhead = newhead->next;
              }
              //delete temp;
              return head;
          }
      };
时间: 2024-10-05 05:32:16

(单链表)单链表的整体逆序和局部逆序的相关文章

数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)

链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链. 链表分为单链表.双链表.循环链表. 一.单链表 插入:链表中插入一个节点的效率很高.向链表中插入一个节点,需要修改它前面的节点(前驱),使其指向新加入的节点,而新加入的节点则指向原来前驱指向的节点(见下图). 由上图可知,B.C之间插入D,三者之间的关系为 current为插入节点的前驱节点 current->next = new              // B节点指向新节点D new->n

C# 数据结构 - 单链表 双链表 环形链表

链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一个节点一个节点去访问,这样所花的时候就比较多了.(顺序表可以弥补这缺点,但插入和删除就非常耗性能) 单链表 单链表的构成:必须要有一个链表头(head),每个节点里面有一个Next用于指向下一个节点(类似于指针).最后一个节点的Next为null来标识链表的尾. 如下图 代码实现 1 /* ----

【编程题目】从尾到头输出链表(链表)☆

58.从尾到头输出链表(链表).题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值.链表结点定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;}; 我的思路:用一个数组存起来已有的数字,再反过来输出.缺点是数组大小是确定的 链表长度不能超过数组的大小 /* 58.从尾到头输出链表(链表). 题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值.链表结点定义如下: struct ListNode { int m_nKey; ListN

Python与数据结构[0] -&gt; 链表[2] -&gt; 链表有环与链表相交判断的 Python 实现

链表有环与链表相交判断的 Python 实现 目录 有环链表 相交链表 1 有环链表 判断链表是否有环可以参考链接, 有环链表主要包括以下几个问题(C语言描述): 判断环是否存在: 可以使用追赶方法,定义两个指针slow和fast,分别以1步和2步前进,若存在环则两者会相遇,否则fast遇到NULL时则退出: 获取环的长度:若存在环,则以相遇点为起点,fast和slow再次开始前进,第二次碰相遇slow走过的步数(1圈)即为环长度: 找出入环点:相遇点到连接点的距离 = 头指针到连接点的距离,因

单生产者/单消费者 的 FIFO 无锁队列

??发现 zeromq 的 yqueue_t 模板类,其数据存储理念设计得非常妙.借这一理念,按照 STL 的泛型类 queue 的接口标准,我设计了一个线程安全的 单生产者/单消费者(单线程push/单线程pop) FIFO 队列,以此满足更为广泛的应用. 1. 数据存储理念的结构图 队列的整体结构上,使用链表的方式,将多个固定长度的 chunk 串联起来: 每个 chunk 则可用于存储队列所需要的元素: 增加一个可交换的 chunk 单元,利于内存复用: 队列使用时,支持 单个线程的 pu

C++11 —— 单生产者/单消费者 的 FIFO 无锁队列

??发现 zeromq 的 yqueue_t 模板类,其数据存储理念设计得非常妙.借这一理念,按照 STL 的泛型类 queue 的接口标准,我设计了一个线程安全的 单生产者/单消费者(单线程push/单线程pop) FIFO 队列,以此满足更为广泛的应用. 1. 数据存储理念的结构图 队列的整体结构上,使用链表的方式,将多个固定长度的 chunk 串联起来: 每个 chunk 则可用于存储队列所需要的元素: 增加一个可交换的 chunk 单元,利于内存复用: 队列使用时,支持 单个线程的 pu

链表算法-链表前面插入节点

链表算法-链表前面插入节点

C语言整数按照二进制逆序,输出逆序后的整数值

问题来源,今天早上和一舍友吃早餐的时候谈到的一个问题,将一个整数按照二进制逆序,然后输出逆序后的数值. 我们知道数值在内存中都是以二进制的形式存放的,假如我们是32位机,每8位为一个字节,int型在32位机上是占4个字节,即32位. 如   2  = 0000 0000 0000 0000 0000 0000 00000 0010(32位) 逆 ^2  = 0100 0000 0000 0000 0000 0000 00000 0000  (这里用^表示逆转) 那么这个操作要如何执行呢?首先补充

并发无锁队列学习之二【单生产者单消费者】

1.前言 最近工作比较忙,加班较多,每天晚上回到家10点多了.我不知道自己还能坚持多久,既然选择了就要做到最好.写博客的少了.总觉得少了点什么,需要继续学习.今天继续上个开篇写,介绍单生产者单消费者模型的队列.根据写入队列的内容是定长还是变长,分为单生产者单消费者定长队列和单生产者单消费者变长队列两种.单生产者单消费者模型的队列操作过程是不需要进行加锁的.生产者通过写索引控制入队操作,消费者通过读索引控制出队列操作.二者相互之间对索引是独享,不存在竞争关系.如下图所示: 2.单生产者单消费者定长