每日一题 为了工作 2020 0322 第二十题

Posted walxt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 为了工作 2020 0322 第二十题相关的知识,希望对你有一定的参考价值。

/**
* 问题: 判断一个链表是否为回文结构
* 给定一个链表的头节点head, 请判断该链表是否为回文结构。
*
* 例如:
* 1->2->1, 返回 true。
* 1->2->2-> 1, 返回 true 。
* 15->6-> 15, 返回 true。
* 1->2->3, 返回 false。
*
* 解答:
* 利用栈结构即可。从左到右遍历链表, 遍历的过程中把每个节点依次压入栈中。
* 因为栈是先进后出的, 所以在遍历完成后, 从栈顶到栈底的节点值出现顺序会
* 与原链表从左到右的值出现顺序反过来。那么, 如果一个链表是回文结构,
* 逆序之后, 值出现的次序还是一样的, 如果不是回文结构, 顺序就肯定对不上。
*
* 例如:
* 链表 1->2->3->4, 从左到右依次压栈之后, 从栈顶到栈底的节点值顺序为 4, 3, 2, 1。
* 两者顺序对不上, 所以这个链表不是回文结构。
* 链表1->2->2->1从左到右依次压栈之后, 从栈顶到栈底的节点值顺序为 1, 2, 2, 1。
* 两者顺序一样, 所以这个链表是回文结构。
*
* 分析:
* 需要一个额外的栈结构, 并且需要把所有的节点都压入栈中, 所以这个额外的栈结构需要 O(N)的空间。
*
*
* @author 雪瞳
*
*/

public class Node {
	public int value;
	public Node next;
	public Node(int data){
		this.value=data;
	}
}

  

public class Palindrome {

	private Stack<Integer> stack = null;
	private int currentValue = 0;
	private Node currentNext = null;
	private int stackValue = 0;
	
	public boolean isPalindrome(Node head) {
		
		stack = new Stack<>();
		currentNext = head;
		//将链表内元素压入栈内 链表尾对应栈顶
		while(currentNext!=null) {
			currentValue = currentNext.value;
			stack.push(currentValue);
			currentNext = currentNext.next;
		}
		//判断
		while(!stack.isEmpty()) {
			stackValue = stack.peek();
			currentValue = head.value;
			if(stackValue == currentValue) {
				stack.pop();
				head=head.next;
			}else {
				return false;
			}
		}
		return true;	
	}
}

  

public class TestIsPalindrome {
    
    private static boolean tip;
    
    public static void main(String[] args) {
        Palindrome plre = new Palindrome();
        TestIsPalindrome test = new TestIsPalindrome();
        Node head = new Node(1);
        Node n1 = new Node(2);
        Node n2 = new Node(1);
        Node n3 = new Node(4);
        Node n4 = new Node(5);

        
        // 1 2 1
        head.next = n1;
        n1.next = n3;
        
        test.showNode(head);
        tip = plre.isPalindrome(head);
        test.tipPrint(tip);;
    }
    public void showNode(Node head) {
        System.out.println("链表内的元素如下所示...");
        while(head != null) {
            System.out.print(head.value+"	");
            head = head.next;
        }
        System.out.println();
    }
    public void tipPrint(boolean tip) {
        if(tip) {
            System.out.println("该链表是回文型链表!");
        }else {
            System.out.println("该链表不是回文型链表!");
        }
    }
    
}

技术图片

 

 

以上是关于每日一题 为了工作 2020 0322 第二十题的主要内容,如果未能解决你的问题,请参考以下文章

每日一题 为了工作 2020 0312 第十题

每日一题 为了工作 2020 04011 第四十题

每日一题 为了工作 2020 0325 第二十三题

每日一题 为了工作 2020 0501 第六十题

每日一题 为了工作 2020 0304 第二题

C#三十六道简单填空题