当前位置: 首页 > article >正文

链表练习1

链表练习

总体思路就是需要设置虚拟头节点。

1.删完节点记得释放内存。

2.遍历的条件需要时cur->next, 因为cur只是一个虚拟节点。

3.dummyHead指向原链表。确保返回头节点。cur负责移动删除链表结点。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) 
    {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;//将虚拟头节点指向head,方便后面的操作
        ListNode* cur = dummyHead;
        while(cur->next != NULL)
        {
            if(cur->next->val == val)
            {
                LisNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            }
            else
            {
                cur = cur->next;
            }

        }

        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};

反转链表

思路:

不要忘记空指针。要想到null。

1.使用prev标记空,cur标记头指针,next1标记cur-next。三个指针一起往前移动,进行值的交换反转。

prev主要是记住cur的上一个元素。

next1主要是为了记住cur的下一个元素。

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    
        ListNode* prev = nullptr;
        ListNode* cur = head;
        while(cur != nullptr)
        {
          ListNode* next1 = cur->next;
          cur->next = prev;
          prev = cur;
          
          cur = next1;
        
        }
        return prev;
    }
};

头插法反转链表

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    
       
        ListNode* dummy = new ListNode(0);
       
        ListNode* cur = head;
        ListNode* p = dummy;
        while(cur != NULL)
        {
            ListNode* tmp = cur;
            cur = cur->next;
            tmp->next = p->next;//把原来头节点的next节点赋值给 这个新来的头节点tmp的next中。因为这是头插。
            p->next = tmp;//然后连接tmp。
        }
        return dummy->next;
    }
}

找到链表的中间结点

1.快慢指针法。只需遍历一遍。

2.先遍历一遍求节点数目,再遍历一遍得到中间节点。遍历两遍。

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* cur = head;
        int count = 0;
        while(cur != nullptr)
        {
            cur = cur->next;
            count++;
        }
      count = count / 2;
        
     
        for(int i = 0; i < count; i++)
        {
             head = head->next;
        }

        return head;
    }
};

http://www.kler.cn/a/273510.html

相关文章:

  • 基于vue框架的的冷链食品物流信息管理系统v81wb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 通过不当变更导致 PostgreSQL 翻车的案例分析与防范
  • Docker部署Meta-Llama-3.1-70B-Instruct API openai格式,vLLM速度对比
  • 响应式编程-reactor
  • CSharp Ollama
  • 关于wordpress instagram feed 插件 (现更名为Smash Balloon Social Photo Feed)
  • Ubuntu软件开发环境搭建
  • 深入理解 C# Unity 中的事件和委托
  • 苍穹外卖-day13:vue基础回顾+进阶
  • qt开发记录
  • idea远程试调jar、远程试调war
  • 智能合约 - 部署ERC20
  • Visual Studio 常用快捷键
  • C++进阶之路---手撕“红黑树”
  • ZnO 阀片的非线性 U-I特性
  • 基于时空上下文(STC)的运动目标跟踪算法,Matlab实现
  • cf火线罗技鼠标宏最细教程(鬼跳,上箱,一键顺,usp速点,雷神三连发及压枪,AK火麒麟压枪.lua脚本)
  • springboot整合springsecurity,从数据库中认证
  • 小程序搜索排名优化二三事
  • 数据结构——lesson10排序之插入排序
  • 配置视图解析器
  • Tomcat:Session ID保持会话
  • DockerFile遇到的坑
  • Linux:Gitlab:16.9.2 (rpm包) 部署及基础操作(1)
  • PPT无法插入页码 解决办法
  • 注册个人小程序