快慢指標 棧 234 回文鍊錶

2021-10-06 15:17:16 字數 2599 閱讀 9564

判斷乙個鍊錶是否為回文鍊錶

使用空間為n:將鍊錶整個壓入棧。然後棧元素彈出。挨個比較元素是否相同。

使用空間為n/2:快慢指標。快指標一次兩步慢指標一次一步。快指標到達結尾時,慢指標到達中間,中間部分之後壓入棧。然後棧彈出元素,與前半部分相比較。

不使用額外空間:快慢指標。快指標一次兩步慢指標一次一步。快指標到達結尾時,慢指標到達中間。然後將後半部分鍊錶逆序。兩個指標分別從頭尾出發,進行元素比較。最後要將後半部分再還原回來。

//壓棧

public

static

boolean

ispalindrome1

(node head)

cur = head;

while

(cur!=null)

cur = cur.next;

}return

true;}

//快慢指標 n/2

public

static

boolean

ispalindrome2

(node head)

node cur = head;

//因為慢指標需要走到中間靠後的乙個位置

node right =head.next;

while

(cur.next!=null && cur.next.next!=null)

stack

stack =

newstack

<

>()

;while

(right!=null)

while

(!stack.

isempty()

) head = head.next;

}return

true;}

//快慢指標 後半部分反轉鍊錶 不占用額外空間

public

static

boolean

ispalindrome3

(node head)

node n1 = head;

//慢 node n2 = head;

//快while

(n2.next!=null &&n2.next.next!=null)

n2 = n1.next;

//先斷後連

/* 鍊錶逆序:

需要三個指標 後指標佔後、當前指標連線、前指標後移、當前指標後移

將第乙個節點的next設為空

改變所有後面指標的next

前指標後移;後指標後移

*/n1.next = null;

node n3 = null;

while

(n2 != null)

n3 = n1;

//儲存最後乙個節點

n2 = head;

boolean res =

true

;while

(n1!=null&&n2!=null)

n1 = n1.next;

n2 = n2.next;

} n1 = n3.next;

n3.next = null;

//頭部指標斷掉

/* 1.斷頭部指標

2. 改變所有後面指標的next

前指標後移;後指標後移

需要三個指標

(在斷掉後者重新連線的時候,一定需要乙個先佔住)

後指標佔後、 當前指標連線、前指標後移、當前指標後移

*/while

(n1!=null)

return res;

}// 後半部分反轉簡便寫法

public

boolean

ispalindrome4

(listnode head)

listnode l_end = slow;

listnode r_start = slow.next;

l_end.next = null;

listnode r_restart =

reverse

(r_start)

; listnode l_start = head;

// 使用乙個值儲存比較的值是否相等

boolean res =

true

; listnode l_cur = l_start;

listnode r_cur = r_restart;

while

(l_cur!=null && r_cur!=null)

l_cur = l_cur.next;

r_cur = r_cur.next;

}//將後面反轉並連線

r_start =

reverse

(r_restart)

; r_restart.next = null;

l_end.next = r_start;

return res;

}public listnode reverse

(listnode head)

return pre;

}}

234 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false示例 2 輸入 1 2 2 1輸出 true首先建立兩個指標指向鍊錶,然後使其中乙個指標指向鍊錶中間,這裡可以使用另乙個指標快速移動,當另乙個指標移動速度是前一根指標的一倍時,就可以使slow指標到一半,而fast指標遍歷完了。使用...

234 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?正確思路是1.先找到鍊錶的中點 通過快慢雙指標,快指標一次移動兩個單位,慢指標一次移動乙個單位,當快指標頂到頭的時...

234回文鍊錶

題目描述 請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 題解思路 首先反思一下,我這一題的第一想法是將整個鍊錶反轉,然後和原鍊錶同步遍歷,全部相同便是回文鍊錶,但是發現,你在反轉鍊錶的時候,原鍊錶被破壞了,所以第一次失敗。然後...