判断一个单链表是否是回文。

回文就是从左往右和从又往左都是一样的数。

方法1:

将每一个节点都入栈,然后再从链表的头部开始和栈中的元素进行比对,弹出一个比对一次,如果每次比对都相等,就说明是回文的。

	public static Boolean isReverse(SingleLinkList list) {
		Node temp = list.head.next;
		Stack<Node> stack = new Stack();
		while(temp!=null) {
			stack.add(temp);
			temp = temp.next;
		}
		temp = list.head.next;
		while(temp!=null) {
			
			if(temp.no!=stack.pop().no) {
				return false;
			}
			temp = temp.next;
			
		}
		return true;
		
		
	}

方法2:将后半段的链表放入到栈中,然后得到链表的中间节点,将中间节点之后的节点放到栈中,然后将链表前半部分和栈中元素进行比对,如果都相同的话就是回文的。

那么首先得找到中间节点。使用快慢指针,快指针一次走两步,慢指针一次走一步,当快指针到达链表尾部的时候,慢指针就到达了中间,但是这个中间得看情况,链表节点是奇数和偶数这个中点是不一样的。

如果是奇数个节点,那么就刚刚好走到中间,

如果是偶数个节点,走到中间的左边位置。

public static int findMid(SingleLinkList list) {
		Node f = list.head.next;
		Node s = list.head.next;
		int mid = 1;
		while(true) {
			if(f.next==null||f.next.next==null) {
				break;
			}
			f = f.next.next;
			s = s.next;
			mid ++;
		}
		

		return mid;
	}

然后将中点之后的所有节点存到栈中。再一个一个拿出来比对,如果全部相同那么就是回文。

	public static  boolean isReverse(SingleLinkList list) {
		int mid = findMid(list);
		Node temp = list.head.next;
		Stack<Node> s = new Stack<Node>();
		for(int i=1;i<mid;i++) {
			temp = temp.next;
		}
		while(temp!=null) {
			
			s.add(temp);
			temp = temp.next;
			
		}
		temp = list.head.next;
		while(!s.isEmpty()) {
			if(temp.no != s.pop().no) {
				return false;
			}
			temp = temp.next;
		}
		
		
		return true;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值