给定一个链表,怎么判断链表中存储的数据是回文
check whether a single linked list is palindrome. for example: 1->2->1,return ture. and 1->2->3->1 return false; and can you resolve it in linear time. 如果是数组那用递归和非递归都很好解决了,但是链表貌似有点麻烦。
首先给出思路就是:先找到链表中间的节点,记得区分链表中节点个数是奇数还是偶数。然后把链表的前一半节点放入栈之中,之后从中间节点的后一个节点开始,此节点和栈顶节点所存储的值进行比较,如果相等则继续进行后续比较,直到链表结尾。如果中间出现不相等的情况,则不是回文。 那么,怎么样找到链表的中间节点呢。一个方法是遍历一遍链表,统计它的节点个数,然后取个数的中间值(记得区奇数偶数)。这样再次遍历就会找到中间的节点。说道这里应该有思路了,但是还有一个更好的解法,就是设定双指针。
bool isPanli(LinkList head){stack<LinkNode*> stk;LinkNode* slow = head;LinkNode* fast = head;bool flag = false;while (fast) {stk.push(slow);slow = slow->next;fast = fast->next;if (fast) {fast = fast->next;} elseflag = true;}if (flag)stk.pop();while (!stk.empty()) {if (stk.top()->data == slow->data){stk.pop();slow = slow->next;}elsereturn false;}return true;}