第六期:链表回文旋转的秘密

文章目录

    • 1. 反转链表
    • 2. 回文链表
    • 代码
      • 1. 反转链表
      • 2. 回文链表

第六期:链表回文旋转的秘密_第1张图片
PS:每道题解题方法不唯一,欢迎讨论!每道题后都有解析帮助你分析做题,答案在最下面,关注博主每天持续更新。

1. 反转链表

题目描述:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
第六期:链表回文旋转的秘密_第2张图片
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例2:
12
输入:head = [1,2]
输出:[2,1]
解析:
我们可以直接遍历链表使用迭代,创建cur节点等于head,交换节点tmp,tmp开始可以为null,然后使用cur节点遍历链表,每次使用curnext记录cur.next,然后让cur.next指向tmp,tmp等于cur用于下一次交换,cur在等于curnext用于遍历。

2. 回文链表

题目描述:
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例1:
第六期:链表回文旋转的秘密_第3张图片
输入:head = [4,3,5,7,5,3,4]
输出:true
示例2:
第六期:链表回文旋转的秘密_第4张图片
输入:head = [4,3,5,7]
输出:false
解析:
这道题就相当于1的进阶,一共三步:

  1. 使用快慢指针找到链表中点。
  2. 逆序后半部分。
  3. 从头、中点,开始比较是否相同。

代码

1. 反转链表

    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode cur = head;
        ListNode tmp = null;
        while(cur != null){
            ListNode curnext = cur.next;
            cur.next = tmp;
            tmp = cur;
            cur = curnext; 
        }
        return tmp;
    }

2. 回文链表

    public boolean isPalindrome(ListNode head) {
        if(head == null || head.next == null){
            return true;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next; 
        }
        ListNode cur = slow;
        ListNode tmp = null;
        while(cur != null){
            ListNode curnext = cur.next;
            cur.next = tmp;
            tmp = cur;
            cur = curnext;
        }
        while(tmp != null){
            if(tmp.val != head.val){
                return false;
            }
            tmp = tmp.next;
            head = head.next;
        }
        return true;
    }

你可能感兴趣的:(数据结构刷题库,链表,数据结构)