START 입력 ⼀ 목록 노드의 하나의 머리, 숫자가 파일 목록 뒷면에없는 것으로 판단
/**
* 单链表节点的定义:
* public class ListNode {
* int val;
* ListNode next;
* }
*/
boolean isPalindrome(ListNode head);
입력 : 1-> 2-> 널 출력 : FALSE
입력 : 1-> 2-> 2-> 1- > 널 출력 : 참
회문를 분석, 가장 일반적으로 사용되는 이중 포인터입니다.
하지만 하나의 연결리스트 탐색 뒤로, 이중 포인터를 사용할 수 없습니다
방법 1 : 역 목록
반전 원래리스트는 새로운 목록을 저장하고 있는지 같은 두 목록과 비교되는
알고리즘의 시간과 공간 복잡도는 O (N)
방법 2 : 이진 트리를 탐색 - 스택 구조
아이디어를 탐색하여 ⼆ 트리 후 명시 적으로 반전 원래의 목록을 역순으로 목록을 통과 할 수 없다
모두 재귀 적 구조, 트리 구조 그러나 파생 상품의 목록을 ⽣ 나열합니다. 음, 목록은 실제로 예약 주문 탐색 및 postorder 할 수 있습니다 :
void traverse(ListNode head) {
// 前序遍历代码
traverse(head.next);
// 后序遍历代码
}
내가 링크 된 목록에 발 양의 값을 인쇄 주문하려는 경우, 당신은 코드 예약 주문 이송 위치를 쓸 수,
다른 손에, 당신이 postorder 순회 위치에서 작동 할 수 있습니다 목록을 통과 되돌리고 싶은 경우 :
//倒序打印单链表中的元素值
void traverse(ListNode head){
if(head == null) return;
traverse(head.next);
//后序遍历代码
print(head.val);
}
파일에 대한 포인터 미믹 더블 백 함수 달성 판정
알고리즘의 시간과 공간 복잡성을 O (N) 인
//左侧指针
ListNode left;
boolean isPalidrome(ListNode head){
left = head;
return traverse(head);
}
boolean traverse(ListNode right){
if(right == null) return true; //递归终点:right到达最右侧 ==null
boolean res = traverse(right.next);
//后序遍历代码
res = res && (right.val == left.val); //right到达最右侧返回后,递归里的right是最后一个节点,res是true
left = left.next;
return res;
}
원자력 센터 가중 논리 : 사실, START ⼀ 노드 목록은 다음 기회 요소의 순서가 반대하지만, 우리의 관심은 이미 ⽽ 재귀 함수를 사용하여 스택하는이 시간을 스택을 넣어.
방법 세 : 부분적으로 만 중간 지점 목록 뒤에 반전
알고리즘의 전체 시간 복잡도가 O (N)이고, 상기 공간 복잡도 O (1)
- [비스 포인터] 포인터 속도에 의해 첫 번째 목록의 중간 점을 찾으려면
ListNode slow, fast;
slow = fast = head;
while(fast != null && fast.next){ //根据fast判断while条件,fast走到最后的前一个位置,下一步需要分情况
slow = slow..next;
fast = fast.next.next;
}
//slow指针现在指向链表中点
포인터가 빠른 널 (null)을 가리 키지 않는 경우 2. 목록 설명 길이는 느린 단계 더와 너무, 홀수
이 반전 느린 시작
반전 목록 뒤에서 3. 느린 시작을하고, 팔린 드롬 서열을 비교
ListNode left = head;
ListNode right = reverse(slow); //reverse函数返回反转后的头结点,就是right位置
while(right != null){ // 比较回文串,right指针的终点是null
if(left.val != right.val)
return false;
left = left.next;
right = right.next;
}
return true;
비 재귀 반전, 노드에 반전
ListNode reverse(ListNode head){
ListNode pre = null, cur = head;
while(cur != null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
- 입력의 원래 사슬 구조 유지할 수
키 P, Q 양 손 위치를 구한다
함수 반환 더한 해시 코드리스트의 원래 순서로 복원하기 직전 p.next = 역방향 (Q)를;