请判断一个链表是否为回文链表。
示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int x) { val = x; } * } */ public class Solution { public bool IsPalindrome(ListNode head) { //反转前端链表 int num = 0; ListNode temp = head; while(temp != null) { num++; temp = temp.next; } int medioNum = num / 2; ListNode preNode = null; ListNode curNode = head; ListNode startNode = null; while(medioNum != 0)//反转前半段链表 { temp = curNode.next; curNode.next = preNode; preNode = curNode; curNode = temp; medioNum--; } //此时,preNode为前半段的头结点,curNode为后半段的头结点 if(num % 2 == 1) { //链表为奇数的情况下,中间的结点为公有结点不用检查 curNode = curNode.next; } while(curNode != null) { if(curNode.val != preNode.val) return false; curNode = curNode.next; preNode = preNode.next; } return true; } }
一次过,我都惊呆了,虽然不难。先遍历链表计算链表的长度,反转前半段的链表,然后逐个对比就可以了。