暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下。首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向。

下面直接看看LeetCode上的题目:

206. Reverse Linked List

这是一道最基本的链表反转题目。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) return head;
ListNode *p = head;
ListNode *q = head->next;
head->next = NULL;
while (q) {
ListNode *r = q->next;
q->next = p;
p = q;
q = r;
}
return p;
}
};

其实就是不断地将当前访问到的位置的next指针指向它前面的指针,这是最基本的操作了。

92. Reverse Linked List II

这道题目规定了要进行反转的位置区间,比上一题加大了难度。我们要先添加一个头指针,指向head节点(最后返回头指针的next即可);然后一直往后访问,一直到要反转的节点的前一位停下来。

我们要记录下两个节点的位置:开始反转位置的节点的前一位、开始反转位置的节点。因为在反转后,开始反转的节点的前一个节点的next指针要指向反转的最后一个节点,开始反转的节点的next要指向反转的最后一个节点的后一个节点。

然后进行与上面一题同样的反转即可。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (m == n) return head;
ListNode *cur = new ListNode();
cur->next = head;
ListNode *copy = cur;
for (int i = ; i < m - ; i++) {
cur = cur->next;
}
ListNode *temp1 = cur, *temp2 = cur->next;
cur = cur->next;
ListNode *p = cur, *q = cur->next;
for (int i = m; i < n; i++) {
ListNode *r = q->next;
q->next = p;
p = q;
q = r;
}
temp1->next = p;
temp2->next = q;
return copy->next;
}
};

234. Palindrome Linked List

这一题要求在O(n)的时间复杂度和O(1)的空间复杂度下,判断一个链表是否回文链表。

我们可以利用一快一慢两个指针同时前进,当快指针到链表的末尾(即不能往后走)时,慢指针就走到序列中间。(这里有一点值得注意,就是无论节点个数是奇数还是偶数,此时从慢指针指向的节点的后一个节点开始反转就可以了)。反转后,对链表的前半部分和后半部分逐个比较即可。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode *copy = head;
if (head == NULL || head->next == NULL) return true;
ListNode * slow = head, *fast = head;
while (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
}
slow = slow->next;
ListNode *p = slow;
ListNode *q = slow->next;
slow->next = NULL;
while (q) {
ListNode *r = q->next;
q->next = p;
p = q;
q = r;
}
while (p) {
if (p->val != copy->val) {
return false;
}
p = p->next;
copy = copy->next;
}
return true;
}
};

[LeetCode] 链表反转相关题目的更多相关文章

  1. (leetcode)链表反转-c语言实现

    反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 使用迭代方法,代码 ...

  2. Leetcode Lect1 String相关题目

    Java 的 String 类基本用法介绍:http://www.runoob.com/java/java-string.html Java 的 String.substring 函数:https:/ ...

  3. 前端与算法 leetcode 344. 反转字符串

    目录 # 前端与算法 leetcode 344. 反转字符串 题目描述 概要 提示 解析 解法一:双指针 解法二:递归 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 lee ...

  4. 链表反转&交换链表结点

    leetcode链表反转链接 要求摘要: 反转一个单链表 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-&g ...

  5. [LeetCode] [链表] 相关题目总结

    刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 ...

  6. Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表)

    Leetcode 25. Reverse Nodes in k-Group 以每组k个结点进行链表反转(链表) 题目描述 已知一个链表,每次对k个节点进行反转,最后返回反转后的链表 测试样例 Inpu ...

  7. LeetCode: Palindrome 回文相关题目

    LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ...

  8. leetcode链表相关

    目录 2/445两数相加 综合题(328奇偶链表, 206反转链表, 21合并两个有序链表 ) 92反转链表 II 链表排序(148排序链表, 876链表的中间结点) 142环形链表 II 160相交 ...

  9. leetcode tree相关题目总结

    leetcode tree相关题目小结 所使用的方法不外乎递归,DFS,BFS. 1. 题100 Same Tree Given two binary trees, write a function ...

随机推荐

  1. mysql常用的操作

    数据库的常用操作:create database db1; #创建数据库show databases; #查看所有数据库show create database db1;#查看创建的指定数据库alte ...

  2. (译)ABP之依赖注入

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Dependency-Injection 什么是依赖注入 传统方式的问题 解决方案 构造函数注入 ...

  3. dijkstra最小花费

    //Gang #include<iostream> #include<cstring> #include<algorithm> #include<cstdio ...

  4. hdu 1496 Equations hash表

    hdu 1496 Equations hash表 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1496 思路: hash表,将原来\(n^{4}\)降 ...

  5. 数据模型与查询语言 ------《Designing Data-Intensive Applications》读书笔记2

    数据模型是开发软件的最重要的部分,因为它们对应用程序有着深远的影响:不仅是软件的编写方式,而且也影响我们如何解决的问题的方式.第二篇读书笔记,我们聊一聊数据模型的设计. 1.数据模型的分层 作为一个开 ...

  6. iOS开发之线程间的MachPort通信与子线程中的Notification转发

    如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...

  7. vue-cli 安装失败Failed to download repo vuejs-templates/webapck-simple: Response code 404 (Not Found)

    新学习vue的萌新们经常会遇到各种各样的坑.例如上面这个报错.这个一般是命令行面板写错单词导致. 正确:vue init webpack-simple .(注意"."点,指当前目录 ...

  8. HDOJ 题目3555 Bomb(数位DP)

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  9. 在Flex中推断是否在组件之外单击的技巧

    在Flex中推断是否在组件之外单击的技巧 昨天在做Flex开发的时候.遇到了这样一种操作,之前也遇到过.那时的办法不是非常好,今天又碰上了类似的问题,先看一张图吧! watermark/2/text/ ...

  10. php&amp;&amp;页面静态化

    页面静态化.主要是出于两个方面的考虑.     第一:訪问html页面的速度比訪问php页面的速度快.在訪问php页面时候.须要对php进行解析.訪问html时候,直接浏览器能够解析出来.特别是PV量 ...