链表的回文结构题解
首先阅读题目:
1.要保证是回文结构
2.他的时间复杂度为O(n)、空间复杂度为O(1)
给出思路:
1.首先利用一个函数找到中间节点
2.利用一个函数逆置中间节点往后的所有节点
3.现在有两个链表,第一个链表取头节点一直到中间节点、第二个链表取头结点到尾结点
4.比较两个链表,从头比到尾,如果都相同,就返回true,否则返回false
解答题目:
1.首先完成函数来找到中间节点,这个以前讲过,可以参考下面链接:
https://blog.csdn.net/xpcxpt/article/details/147618198?spm=1001.2014.3001.5501
2.完成函数实现逆置,这个以前也讲过,可以参考下面链接:
https://blog.csdn.net/xpcxpt/article/details/147618123?spm=1001.2014.3001.5501
3.有了两个前置函数middleNode()和reverseList(),可以很好的解决题目
定义两个指针接受函数的返回值;
while循环比较两个链表,都相同返回true,有一个不相同就返回false
代码如下:
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
typedef struct ListNode LSTNode;
class PalindromeList {public:struct ListNode* middleNode(struct ListNode* head) {LSTNode* slow, *fast;fast = slow = head;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}return slow;}struct ListNode* reverseList(struct ListNode* head) {if (head == NULL) {return head;}LSTNode* n1, *n2, *n3;n1 = NULL;n2 = head;n3 = n2->next;while (n2) {n2->next = n1;n1 = n2;n2 = n3;if (n3) {n3 = n3->next;}}return n1;}bool chkPalindrome(ListNode* A) {struct ListNode* mid = middleNode(A);//指向中间节点的指针struct ListNode* rmid=reverseList(mid);//逆置了,这个指针指向的相同于原链表的尾结点while(rmid&&A)//两个都不能为空{if(rmid->val!=A->val)//有一个不相同{return false;}rmid=rmid->next;//向后走A=A->next;//向后走}return true;//都相同的情况}
};