博主作为一名Java初学者,决定先从最简单直接的方法做起,并从中加强基础,之后再用其他更简单的方法。
请判断一个链表是否为回文链表
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) return true;
ListNode fast = head;
ListNode slow = head;
ListNode pre = null;
//1.快慢指针,找到链表的中点。
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
//2.将slow之后链表反转
while(slow != null){
ListNode next = slow.next;
slow.next = pre;
pre = slow;
slow = next;
}
//3.前后链表进行比较,注意若为奇数链表,多1一个节点,然而并不影响判断回文
while(head != null && pre != null){
if(head.val != pre.val) return false;
head = head.next;
pre = pre.next;
}
return true;
}
}
基础回顾
主要是找到链表的中点并对中点后的链表进行反转。找中点通过快慢指针,在纸上画图一目了然,反转链表又是一个典型题。
leetcode反转链表题
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
if(head == null || head.next == null) return head;
while(cur != null){
//暂存
ListNode temp = cur.next;
//指向
cur.next = pre;
//归位
pre = cur;
cur = temp;
}
return pre;
}
}
反转链表分三步走:
- 1、暂存,用temp指向cur.next,这样取出cur后,cur.next后的链表不会被回收。
- 2、指向,让取出的cur指向pre,第一次while循环中的pre为null。
- 3、归位,先归位pre,再归位cur,这样能保证归位成功。
相似类型leetcode合并有序链表题
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//通过哑结点dummyHead指向较小的链表
//move作为遍历链表的辅助指针
ListNode dummyHead = new ListNode(-1);
ListNode move = dummyHead;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
move.next = l1;
l1 = l1.next;
move = move.next;
}else{
move.next = l2;
l2 = l2.next;
move = move.next;
}
}
//链表为空则直接指向另一个链表
if(l1 == null) move.next = l2;
if(l2 == null) move.next = l1;
return dummyHead.next;
}
}