题目:给定一个单链表,判断是否为回文链表。详见LeetCode-234题
【Java版】代码实现
public class MyTest {
/**
* 声明单链表
*/
static class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public static void main(String[] args) {
ListNode l1 = new ListNode(1);
ListNode l2 = new ListNode(2, l1);
ListNode l3 = new ListNode(3, l2);
// 测试链表长度为奇数、偶数的情况
// ListNode l6 = new ListNode(3, l3);
// ListNode l4 = new ListNode(2, l6);
ListNode l4 = new ListNode(2, l3);
ListNode l5 = new ListNode(1, l4);
System.out.println(isPalindromeList(l5));
}
public static boolean isPalindromeList(ListNode head) {
ListNode fast = head;
ListNode slow = head;
ListNode pre = null, curr = null;
while (fast != null && fast.next != null) {
curr = slow; // 1.记录slow位置
slow = slow.next; // 2. 移动快慢指针
fast = fast.next.next;
curr.next = pre; // 3. 反转链表前半段
pre = curr;
}
if (fast != null) { // 链表长度为奇数的情况
slow = slow.next;
}
while (slow != null) {
if (slow.val != curr.val) {
return false;
}
slow = slow.next;
curr = curr.next;
}
return true;
}
}
注意:
- 先记录slow指针位置,再移动快慢指针,最后反转前半段
- 判读链表长度是否为奇数个