リンクリストの回文
リンクリストの回文構造—Niuke.comリンク
トピックの内容:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
入力と出力の例:
输入:
1->2->2->1
输出:
true
1.コードの実装
方法1:最初にリンクリストを逆にし、次にトラバースして、それらが等しいかどうかを比較します。
public boolean chkPalindrome(ListNode A) {
// write code here
//1.思路一:首先将链表反转,然后比较是否相等
ListNode B = reverseList(A);//将链表进行反转
//开始遍历,比较俩个链表
while (A != null){
//循环条件也可以是B不等于null,因为反转过,链表长度肯定一样
if (A.val != B.val){
return false;
}else {
A = A.next;
B = B.next;
}
}
return true;
}
//反转链表的方法
public ListNode reverseList(ListNode head) {
//迭代的方法需要保存前一个节点
ListNode pre = null;
ListNode cur = head;//用来遍历的节点
while (cur != null){
//1.首先将cur后面的链表保存下来
ListNode next = cur.next;
//2.然后将cur.next变为它的前一个节点
cur.next = pre;
//3.然后pre保存新链表(也就是反转链表的头节点)
pre = cur;
//4.cur继续遍历原来的链表
cur = next;
}
//5.遍历完成,返回新链表的头节点
return pre;
}
方法2:最初のトラバーサルはノードの値をスタックに入れ、1回トラバースした後、それをスタック内の要素と比較します(スタックの最初の最後のアウトを使用)
public boolean chkPalindrome(ListNode A) {
// write code here
Stack<Integer> stack = new Stack<>();
//1.第一遍遍历,入栈
ListNode cur = A;
while (cur != null){
stack.push(cur.val);
cur = cur.next;
}
//2.第二遍遍历,进行比较
while (A != null){
if (A.val != stack.pop()){
return false;
}
A = A.next;
}
return true;
}