判断链表是否为回文链表
对应leetCode 234:
java代码实现,主要记录算法思路。
思路:
使用快慢两个指针,快指针一次向后两个节点,慢指针一次向后一个节点,在快慢指向后针遍历的同时将慢回溯,最后慢指针停在链表的中间;取两个指针,以慢指针为中心点,向两边遍历比较是否为回文链表;
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
/*链表只有一个或两个节点的情况*/
if (head == null || head.next == null) {
return true;
}
ListNode prev = null;//前一个节点previous
ListNode slow = head;//满指针slow
ListNode fast = head;//快指针fast
/*移动快慢指针并将慢指针回溯*/
while (fast != null && fast.next != null) {//循环满足的条件
fast = fast.next.next;
/*移动慢指针并回溯*/
ListNode next = slow.next;//首先保存慢指针的下一个节点
slow.next = prev;//将慢指针指向前一个节点
prev = slow;//更改前一个节点为当前节点,为下一次回溯准备;
slow = next;//相当于:slow=slow.next移动慢指针
}
/*
链表遍历完成:
当链表节点数目为奇数时,fast节点不为空
当链表节点数目为偶数时,fast节点为空
*/
if (fast != null) {//链表节点为奇数个,此时slow指针位于中心处
slow = slow.next;//将slow指针向后移动一位;
}
/*若为偶数,可以直接使用slow和prev指针*/
while (slow != null) {
if (slow.val != prev.val) {
return false;
}
slow = slow.next;//向右遍历
prev = prev.next;//向左回溯
}
return true;
}
}
关于奇偶数判别:
奇数链表结点:1,2,3,4,5
按照代码遍历完成之后:(条件:fast和fast.next不为空)
slow指针指向”3“节点,fast指针指向“5”节点(不为空);prev指针指向“2”,需slow向后一个节点到“4”进行比较
偶数链表结点:1,2,3,4
按照代码遍历完成之后:
slow指针指向“3”节点,fast指针指向为null,prev指针指向是“2”;
posted on 2020-02-11 21:34 passionConstant 阅读(257) 评论(0) 编辑 收藏 举报