【算法萌新闯力扣】:回文链表

    力扣题目:回文链表

开篇

  今天是备战蓝桥杯的第23天。我加入的编程导航算法通关村也在今天开营啦!那从现在起,我的算法题更新会按照算法村的给的路线更新,更加系统。大家也可以关注我新开的专栏“算法通关村”。里面会有更全面的知识点和题目的分享。

题目链接: 234.回文链表

题目描述

代码思路1

1.一开始写的时候,感觉在链表里操作太麻烦了,就利用list集合把链表里的元素存起来,然后在链表里判断就行(也可以放数组里)
2.既然存在集合里,那回文数的判断就轻轻松松喽。这里我使用左右指针,一个在头,一个在尾,两个指针同时往中间移动,只要有一次两个指针对应的数据不相等,则不是回文

代码纯享版

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        List<Integer> list = new ArrayList<>();
        ListNode node = head;
        while(node != null){
            list.add(node.val);
            node = node.next;
        }
        int left = 0, right = list.size() - 1;
        while(left < right){
            if(list.get(left) != list.get(right)) return false;
            left++;
            right--;
        }
        return true;
    }
}

代码逐行解析版

class Solution {
    public boolean isPalindrome(ListNode head) {
        List<Integer> list = new ArrayList<>(); //创建list集合
        ListNode node = head; //创建结点node指向头结点
        while(node != null){ //当node不为空时
            list.add(node.val); //将该结点添加到集合中
            node = node.next; //node指向下一个结点
        }
        int left = 0, right = list.size() - 1; //创建左右指针,分别指向集合到开头和结尾
        while(left < right){ //循环条件是两个指针相遇前
            if(list.get(left) != list.get(right)) return false; //两个指针对应的数如果不相等,则不是回文,返回false
            left++; //左指针右移
            right--; //右指针左移
        }
        return true;//没有false的情况,返回true
    }
}

代码思路2

上面第一种方法被算法村的讲义说是逃避链表,面试不能这样,只能含泪考虑其他思路。
第二种思路是利用栈后进先出的特点,先把整个链表压入栈中,然后同时遍历链表和输出栈顶元素,一一比较,不相同则不是回文数

代码纯享版

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
     public boolean isPalindrome(ListNode head) {
         Stack<Integer> stack = new Stack<>(); 
         ListNode node = head;
         while(node != null){
             stack.push(node.val);
             node = node.next;
         }
         node = head;
         while(node != null){
             if(stack.pop() != node.val) return false;
             node = node.next;
         }
         return true;
     }
}

代码逐行解析版

class Solution {
     public boolean isPalindrome(ListNode head) {
         Stack<Integer> stack = new Stack<>(); //创建一个栈
         ListNode node = head; //创建node结点指向头结点
         while(node != null){ //node不为空时
             stack.push(node.val);//把node结点的值压入栈中
             node = node.next; //node指向下一个结点
         }
         node = head; //node重新指向头结点
         while(node != null){ //node不为空时
             if(stack.pop() != node.val) return false; //栈顶元素出栈,如果栈顶元素与node结点的值不相等,返回false
             node = node.next; //node指向下一个结点
         }
         return true;//没有false的情况,返回true
     }

}

结语

 如果这道题的分享对您有所帮助,点个关注,我会每天更新力扣题的讲解,与大伙儿一起向前迈进!

你可能感兴趣的:(Java算法,算法,leetcode,链表,数据结构,java)