判断字符串是否是回文字符串

判断字符串是否是回文字符串

回文串的链表实现

总体思路

  1. 利用快慢指针找到链表的中间节点
  2. 将链表后半段反转
  3. 判断完之后将链表还原

要点

1. 快慢指针寻找中间节点

​ 利用两个指针,快指针每次移动2,慢指针每次移动1,当快指针移动到末尾时慢指针刚好到中间。

​ 代码如下:

public Node getMid() {
	Node slow = head;
	Node fast = head;
	while(fast.next != null && fast.next.next != null) {
		slow = slow.next;
		fast = fast.next.next;
	}
	return slow;
}
2. 链表反转

​ 将给定头节点的链表反转。

​ 代码如下:

public Node reverse(Node h) {
	//h为存着数据的第一个节点
    Node o = h;
	Node p = h.next;
	Node q = p.next;
    h.next = null;
	while(q != null) {
		p.next = o;
		o = p;
		p = q;
		q = q.next;
	}
	p.next = o;
	return p;
}

复杂度分析

​ 排除构建链表所必须的空间外,时间复杂度为O(n),空间复杂度为O(1)。

代码:

import java.util.*;

class LinkedList {
	
	private Node head = null;
	
	public static void main(String[] args) {
		LinkedList list = new LinkedList();
		Scanner input = new Scanner(System.in);
		String str = input.next();
		char[] ch = str.toCharArray();
		input.close();
		
		for(char c : ch) {
			list.insert(list.getNewNode(c));
		}
		if(list.isPlalindrome())
			System.out.println("字符串是回文串");
		else System.out.println("字符串不是回文串");
	}
	
	// 是否为回文串
	public boolean isPlalindrome() {
		if(head.next == null) return false;
		boolean flag = true;
		Node mid = getMid();
		Node tail = reverse(mid);
		// print(tail);
		Node h = head;
		Node t = tail;
		while(h.next != null && h != t) {
			if(h.data != t.data) {
				flag = false;
				break;
			}
			h = h.next;
			t = t.next;
		}
		reverse(tail); //将链表还原
		// print(head);
		return flag;
	}
	
	// 链表反转并且返回反转后的头节点
	public Node reverse(Node h) {
		Node o = h;
		Node p = o.next;
		Node q = p.next;
		while(q != null) {
			p.next = o;
			o = p;
			p = q;
			q = q.next;
		}
		p.next = o;
		h.next = null;
		return p;
	}
	
	// 快慢指针寻找中间节点
	public Node getMid() {
		Node slow = head;
		Node fast = head;
		while(fast.next != null && fast.next.next != null) {
			slow = slow.next;
			fast = fast.next.next;
		}
		return slow;
	}
	
	// 插入节点
	public void insert(Node node) {
		if(head == null)
			head = node;
		else {
			Node p = head;
			while(p.next != null)
				p = p.next;
			p.next = node;
		}
	}
	
	// 打印链表
	public void print(Node p) {
		while(p != null) {
			System.out.print(p.data + " ");
			p = p.next;
		}
	}
	
	// 创建新节点
	public Node getNewNode(char c) {
		return new Node(c, null);
	}
	
	// 链表
	public class Node {
		char data;
		Node next;
		public Node(char data, Node node) {
			this.data = data;
			this.next = node;
		}
	}
}

你可能感兴趣的:(学习路线)