目录
题目描述:
思路:
代码:
代码优化:
题目描述:
给你一个单链表的头节点 head
,请你判断该链表是否为
回文链表
。如果是,返回 true
;否则,返回 false
。
示例 1:
输入:head = [1,2,2,1] 输出:true
示例 2:
输入:head = [1,2] 输出:false
思路:
//1.找中间节点 //2.中间节点之后做反转 //3反转链表与前半部分作比较
代码:
public boolean isPalindrome1(ListNode head){ListNode n1=reverseList(head);while(n1!=null){if(head.value!=n1.value){return false;}n1=n1.next;head=head.next;}return true;}private ListNode reverseList(ListNode head){ListNode n1=middleList(head);if(n1==null||n1.next==null){return n1;}ListNode o1=null;while(n1!=null){ListNode o2=n1.next;n1.next=o1;o1=n1;n1=o2;}return o1;}private ListNode middleList(ListNode head){ListNode p1=head;ListNode p2=head;while(p2!=null&&p2.next!=null){p1=p1.next;p2=p2.next.next;}return p1;}
代码优化:
public boolean isPalindrome(ListNode head){ListNode p1=head;ListNode p2=head;ListNode n1=null;//新链表头ListNode o1=head;//旧链表头while(p2!=null&&p2.next!=null){p1=p1.next;//走到中间节点p2=p2.next.next;//反转
// ListNode o2=o1.next;o1.next=n1;n1=o1;
// o1=o2;o1=p1;}System.out.println(n1);System.out.println(p1);if(p2!=null){//奇数个节点p1=p1.next;}while(n1!=null){if(n1.value!=p1.value){//n1是前半部分,p1继续往后移动return false;}n1=n1.next;p1=p1.next;}return true;}