leetcode234. 回文链表

题目描述:

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

思路:

不想借助额外空间,只能对链表做出改变。借助额外空间反而更容易想出思路,比如转换链表为数组,再借助双指针;或者借助栈进行回溯。这里是不借助额外空间的解法:

  • 特殊情况判断
  • 快慢指针找到链表中点
  • 后半部分的链表翻转,形成新的链表
  • 前半部分和后半部分比较
  • 将后半部分链表折回(我这里没有实现,实现更好)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
                // 特殊情况
		if(head == null || head.next == null) 
			return true;
		
		// 快慢指针对称分割
		ListNode fast = head, slow = head; 
		while(fast != null && fast.next != null) {
			slow = slow.next;
			fast = fast.next.next;
		}
		
		// 翻转后一半的链表,形成新链表
		ListNode rightDummy = new ListNode(-1);
		while(slow != null) {
			ListNode temp = slow;
			slow = slow.next;
			temp.next = rightDummy.next;
			rightDummy.next = temp;			
		}
		
		// 与前一半的链表比较,两个链表共享最后一个节点
		ListNode p = rightDummy.next;
		ListNode q = head;
		while(p != null && q != null) {
			if(p.val == q.val) {
				p = p.next;
				q = q.next;
			}else {
				return false;
			}
		}
		
		return true;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43237362/article/details/105444831