하나의 목록에 파일 등을 결정


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)

  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;
}
  1. 입력의 원래 사슬 구조 유지할 수
    키 P, Q 양 손 위치를 구한다
    함수 반환 더한 해시 코드리스트의 원래 순서로 복원하기 직전 p.next = 역방향 (Q)를;
    ** 여기 ** 그림 삽입 설명
게시 된 149 개 원래 기사 · 원 찬양 5 ·은 30000 +를 볼

추천

출처blog.csdn.net/qq_26327971/article/details/105209312