您的位置:首页 > 其它

lintcode--回文链表

2017-07-17 09:33 190 查看
设计一种方式检查一个链表是否为回文链表。

您在真实的面试中是否遇到过这个题? 

Yes

样例

1->2->1
 就是一个回文链表。

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode(int x) { val = x; }

 * }

思路:

回文串的特征就是正反看结果都一样 

如:aba、abcsdffdscba 

所有翻转链表后比较 

但是翻转链表改变了原始链表之间的指针 

需要先复制原始链表 

复制链表和选择链表进行比较

 */

public class Solution {

    /**

     * @param head a ListNode

     * @return a boolean

     */

    public boolean isPalindrome(ListNode head) {

        // Write your code here

        if(head == null || head.next == null)

            return true;

        ListNode p = head;

        ListNode curHead = copy(head);

        ListNode revHead = reverse(p);

        boolean flag= compare(curHead,revHead);

        return flag;

    }

    public boolean compare(ListNode l1,ListNode l2){

        while(l1!=null && l2!=null){

            if(l1.val!=l2.val)

                return false;

            l1 = l1.next;

            l2 = l2.next;

        }

        return true;

    }

    public ListNode copy(ListNode head){

        ListNode curHead = new ListNode(0);

        ListNode cur = curHead;

        ListNode p = head;

        while(p!=null){

            cur.next = new ListNode(p.val);

            p = p.next;

            cur = cur.next;

        }

        return curHead.next;

    }

    public ListNode reverse(ListNode head){

        ListNode revHead = null;

        ListNode cur = null;

        ListNode p = head;

        while(p!=null){

            //反转

            ListNode pNext = p.next;

            if(pNext==null){

                revHead = p;

            }

            p.next = cur;

         
4000
  cur = p;

            p = pNext;

        }

        return revHead;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: