1. 程式人生 > >迴文連結串列和連結串列reverse()

迴文連結串列和連結串列reverse()

連結
判斷一個連結串列是否是迴文字串?

  • 快慢指標
  • 連結串列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; } }