迴文連結串列和連結串列reverse()
阿新 • • 發佈:2018-11-24
連結
判斷一個連結串列是否是迴文字串?
- 快慢指標
- 連結串列reverse
- 考慮是偶數連結串列還是
reverse
以後都構造不包含頭節點都結果連結串列
其實跟我以前都思路是一樣的想法,同樣是採用頭插入法和分開兩個連結串列的做法情況
public void reverse(ListNode head){
ListNode pre =null;
while(head!=null){
ListNode next =head.next;
head.next =pre;
pre =head;
head =next;
}
return pre;
}
如何判斷是偶數連結串列還是單鏈表的情況下
主要有下面的判斷準則
判斷是否為空,如果最後fast為空,則為偶數連結串列,
如果fast不為空,則為奇數連結串列,這種情況
按照上述做法,找到最後一個
最終的程式碼結構如下
/**
* 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 slow = head,fast=head;
slow = middle(head);
slow = reverse(slow);
while(fast!=null && slow!=null) {
if(fast.val!=slow.val){
return false;
}
fast = fast.next;
slow = slow.next;
}
return true;
}
private ListNode middle(ListNode head){
ListNode slow = head;
ListNode fast = head;
while(fast!=null&& fast.next!=null){
fast =fast.next.next;
slow = slow.next;
}
if(count(head)%2==1) {slow = slow.next;}
return slow;
}
private ListNode reverse(ListNode head){
//不構造一個頭節點,直接返回即可
ListNode pre =null;
while(head!=null){
ListNode next= head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
private int count(ListNode head){
int count =0;
while(head!=null)
{
++count;
head = head.next;
}
return count;
}
}