leetcode面试题 02.06. 回文链表,解题心路

1、题目描述

编写一个函数,检查输入的链表是否是回文的。如图:

试题链接:https://leetcode-cn.com/problems/palindrome-linked-list-lcci/

2、java语言题解一

看到该题,首先想打到的就是使用自己最拿手的语言java来做。首先,我们先来观查题目所给链表的结构:

class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}

由于题目中要求判断一个链表是否回文,因此很自然的一个想法就是,将链表变量,取出其中的值,放在一个有序的容器中。在java中很自然的就想到了list集合,于是就有了下述的解法:

public static boolean isPalindrome(ListNode head) {
List list = new ArrayList();
//定义一个辅助指针,用来遍历链表
ListNode pCurrent = head;
//当链表不为null时,就一直循环
while (pCurrent != null) {
//将该数保存到数组中
list.add(pCurrent.val);
pCurrent = pCurrent.next;
}
//遍历集合,看首尾是否相等
for(int i = 0;i < list.size() / 2;i++) {
if(!list.get(i).equals(list.get(list.size() - i - 1))) {
return false;
}
}
return true;
}

算法效果:

可以看出,该算法在java的提交记录中,时间稍微较慢,当时所需要的内存确实最少的。然而,计算机程序比较关心的是算法的执行效率,因此该算法还得进行改进。

3、java语言题解二

由于上述的算法的执行时间太长,猜想是不是因为使用了List集合而导致的。但是,如果不适用集合,我们的先获取到该链表的长度,然后定义一个大小刚刚适合的数组。代码如下:

public static boolean isPalindrome(ListNode head) {
//定义一个辅助指针,用来遍历链表
ListNode pCurrent = head;
//当链表不为null时,就一直循环
int count = 0;
while (pCurrent != null) {
//计数
count++;
pCurrent = pCurrent.next;
}
//再来一论,装进数组
pCurrent = head;
int[] arr = new int[count];
for(int i = 0;i < count;i++) {
arr[i] = pCurrent.val;
pCurrent = pCurrent.next;
}
//遍历集合,看首尾是否相等
for(int i = 0;i < count / 2;i++) {
if(arr[i] != arr[count - i - 1]) {
return false;
}
}
return true;
}

算法效果:

可以看出,用数组代替集合,增加一次循环后的效率得到大幅度的提升。

4、C语言题解一

奈何,博主目前还是一个本科大学生,在数据结构与算法这门课上垂死挣扎,而考试只允许用C来作答,因此,只有用C语言重写上述的java算法。

  1. 先来看看在C语言中,题目给出的链表的结构题类型
struct ListNode {
int val;
struct ListNode *next;
};

接下来,用C语言来实现上述的java题解二:

bool isPalindrome(struct ListNode* head){
//定义一个辅助指针,用来遍历链表
struct ListNode* pCurrent = head;
//当链表不为null时,就一直循环
int count = 0;
while (pCurrent != NULL) {
//计数
count++;
pCurrent = pCurrent->next;
}
if(count == 0)
return true;
//再来一论,装进数组
pCurrent = head;
int arr[count];
for(int i = 0;i < count;i++) {
arr[i] = pCurrent->val;
pCurrent = pCurrent->next;
}
//遍历集合,看首尾是否相等
for(int i = 0;i < count / 2;i++) {
if(arr[i] != arr[count - i - 1]) {
return false;
}
}
return true;
}

算法效果:

由执行用时可以看出,在C语言的解法中,该算法并不是最优解。

除此之外,还有另外一种思路,就是将链表拆分成两部分,然后使得一部分反转,后遍历两个链表,观察是否相等。但是,该方法经过博主测试后,发现其效率还不如上述解法高效,因此不在叙述,后续如果有新的更高效解法在来叙述。

leetcode面试题 02.06. 回文链表,解题心路的更多相关文章

  1. LeetCode 面试题 02.06. 回文链表

    题目链接:https://leetcode-cn.com/problems/palindrome-linked-list-lcci/ 编写一个函数,检查输入的链表是否是回文的. 示例 1: 输入: 1 ...

  2. [LeetCode] 234. Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...

  3. [LeetCode] Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time ...

  4. Leetcode:234 回文链表

    leetcode:234 回文链表 关键点:请判断一个链表是否为回文链表.示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true. ...

  5. Leetcode 234. 回文链表(进阶)

    1.题目描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O ...

  6. LeetCode 234:回文链表 Palindrome Linked List

    ​ 请判断一个链表是否为回文链表. Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: ...

  7. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

  8. 【leetcode 简单】 第六十七题 回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...

  9. LeetCode OJ:Palindrome Linked List(回文链表判断)

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

随机推荐

  1. [ PyQt入门教程 ] PyQt5中多线程模块QThread使用方法

    本文主要讲解使用多线程模块QThread解决PyQt界面程序唉执行耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题.用户使用工具过程中出现这些问题时会误以为程序出错,从而把程序关闭.这样 ...

  2. Frameworks.Entity.Core 6 Specification

    Specification internal 1 A logic AND Specification密封类AndSpecification<T>继承 抽象类CompositeSpecifi ...

  3. allegro使用经验总结(一)

    在用allegro开发flappy bird.游戏虽然小,但是用到了allegro的方方面面,可以说是"麻雀虽小五脏俱全". 1.physfs 这是一个跨平台的读写文件的库,可以直 ...

  4. 《即时消息技术剖析与实战》学习笔记9——IM系统如何支持消息的多终端漫游

    一.什么是多终端漫游 多终端漫游是指:用户在任意一个设备登录后,都能获取到历史的聊天记录.如:QQ 默认漫游 7 天的聊天记录,开通 VIP 会员可漫游 30 天,开通 SVIP 会员可漫游 2 年. ...

  5. 什么是Druid

    一.Druid是什么 Druid 单词来源于西方古罗马的神话人物,中文常常翻译成德鲁伊. 玩过魔兽世界,暗黑破坏神,Dota,炉石传说,Dota自走棋的朋友,对这个词一定不陌生. 本文中所介绍的Dru ...

  6. CSS-18-媒体查询

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. HTTP负责均衡模块(HTTP Upstream)

    这个模块为后端的服务器提供简单的负载均衡(轮询(round-robin)和连接IP(client IP))如下例: upstream backend  {  server backend1.examp ...

  8. centos7+ docker 实践部署docker及配置direct_lvm

    转载于博客园:http://www.cnblogs.com/Andrew-XinFei/p/6245330.html 前言 Docker现在在后端是那么的火热..尤其当笔者了解了docker是什么.能 ...

  9. 学习记录(Python列表)

    列表(List)是Python语言中最通用的序列数据结构之一,列表是一个没有固定长度的,用来表示任意类型对象的位置相关的有序集合.列表中的数据项不需要具有相同的数据类型 列表的基本操作: 1.创建列表 ...

  10. C++ traits技法的一点理解

    为了更好的理解traits技法.我们一步一步的深入.先从实际写代码的过程中我们遇到诸如下面伪码说起. template< typename T,typename B> void (T a, ...