六六力扣刷题双指针之反转链表

简介: 六六力扣刷题双指针之反转链表

前言

之前小六六一直觉得自己的算法比较菜,算是一个短板吧,以前刷题也还真是三天打鱼,两天晒网,刷几天,然后就慢慢的不坚持了,所以这次,借助平台的活动,打算慢慢的开始开刷,并且自己还会给刷的题总结下,谈谈自己的一些思考,和自己的思路等等,希望对小伙伴能有所帮助吧,也可以借此机会把自己短板补一补,希望自己能坚持下去呀

链表的合集

字符串

双指针

题目

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

image.png

输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]

image.png

输入: head = [1,2]
输出: [2,1]

迭代

假设链表为 1 -> 2 ->3 1→2→3→∅,我们想要把它改成  1<-2<-3∅←1←2←3。

在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}

双指针

定义两个指针: prepre 和 curcur ;prepre 在前 curcur 在后。 每次让 prepre 的 nextnext 指向 curcur ,实现一次局部反转 局部反转完成之后,prepre 和 curcur 同时往前移动一个位置 循环上述过程,直至 prepre 到达链表尾部

class Solution {
  public ListNode reverseList(ListNode head) {
    //申请节点,pre和 cur,pre指向null
    ListNode pre = null;
    ListNode cur = head;
    ListNode tmp = null;
    while(cur!=null) {
      //记录当前节点的下一个节点
      tmp = cur.next;
      //然后将当前节点指向pre
      cur.next = pre;
      //pre和cur节点都前进一位
      pre = cur;
      cur = tmp;
    }
    return pre;
  }
}

结束

好了,我们的双指针也差不多了,我们明天开始刷其他的了,大家继续加油,我是小六六,三天打鱼,两天晒网!

相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
335 1
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
241 1
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
453 0
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客
|
机器学习/深度学习
【刷题记录】相交链表
【刷题记录】相交链表
180 0
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点
231 0
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
2345 13