1. 回文链表
题目如下:leetcode-234
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目确实很简单,但是自己在解题途中发生了一个错误,就是自己知道要翻转后半部分的链表,但是却没有在快慢指针的时候限定快指针的结束位置不能够为null
,最后导致每次翻转被翻转的一定会少一个节点!就导致了解题错误!翻转若是null传入,表示不用翻转,违背自己初衷
2. 解题&代码
大致解题主要是注意翻转后半部分就好,翻转可以采用递归翻转和非递归方式翻转!现在面试中考察的多的是递归翻转!
代码如下:
public boolean isPalindrome(ListNode head) { if (head == null || head.next == null) return true; ListNode fast = head; ListNode slow = head; // 这里只需要将fast节点的停止条件前移即可 while (fast.next != null && fast.next.next != null) { fast = fast.next.next; slow = slow.next; } // 翻转后部链表 fast = slow.next; slow.next = null; slow = head; fast = reverseNode(fast); // 开始比对,只要不相等就返回false while (fast != null) { if (slow.val != fast.val) return false; fast = fast.next; slow = slow.next; } return true; } /** * 非递归版本 */ public ListNode reverseNode(ListNode head) { if (head == null || head.next == null) return head; ListNode p = null; while (head != null) { ListNode temp = head.next; head.next = p; p = head; head = temp; } return p; } /** * 递归版本 */ public ListNode recurseNode(ListNode head){ if(head == null || head.next == null) return head; ListNode node = recurseNode(head.next); head.next.next = head; head.next = null; return node; }
3. 小结
题目很简单,但是自己还是出现了点小问题,说明思考的还是不够细致!还需要继续加油!
keep thinking, keep coding! 2020-10-23写于南京