给你一个单链表的头节点
head
,请你判断该链表是否为回文链表。如果是,返回true
;否则,返回false
。示例 1:
输入:head = [1,2,2,1] 输出:true示例 2:
输入:head = [1,2] 输出:false提示:
- 链表中节点数目在范围
[1, 105]
内0 <= Node.val <= 9
题解(创建一个新的链表)
public boolean isPalindrome(ListNode head) { //新建一个链表存储原链表逆序后的链表 ListNode dummyHead= new ListNode(); ListNode node=head; for (;node!=null;node=node.next){ ListNode x= new ListNode(); x.val=node.val; x.next=dummyHead.next; dummyHead.next=x; } ListNode reseverHead=dummyHead.next;//逆序链表的头结点 for (node=head;node!=null;node=node.next){//将逆序的链表和原链表逐个比较 if (node.val!=reseverHead.val){ return false; } reseverHead=reseverHead.next; } return true; }
题解(部分逆序+找中间节点)
- 两个节点 一个head头结点 一个mid是中间节点
- 比较这个两个结点和后继节点比较是否完全相同,如果完全相同那么就是回文,不是则不是回文链表
- 当比较的次数==链表长度除2
JAVA实现的代码
public boolean isPalindrome(ListNode head) { if (head==null){ //如果是空链表,不是回文链表 return false; } int length =0;//链表的长度 ListNode x=null; for (x=head;x!=null;x=x.next) { length++; } int count=0;//比较的次数 ListNode middle=middleNode(head); ListNode resever=reverse(middle); while (count<length/2){//当比较的次数为length/2,就是结束比较 if (head.val!=resever.val){ return false; //如果有一个不相同,就肯定不是回文链表 } head=head.next; resever=resever.next; count++; } return true; } public ListNode middleNode(ListNode head) { //找到一个链表的中间节点 ListNode fir=head; ListNode sec=head; while (sec!=null&&sec.next!=null){ fir=fir.next; sec=sec.next.next; } return fir; } public ListNode reverse(ListNode head) { //将传入的链表逆序 if (head==null||head.next==null){ return head; } ListNode next=head.next; ListNode nextHead=reverse(head.next); next.next=head; head.next=null; return nextHead; }