本题是没有对C的支持的,但因为Cpp支持C,所以这里就用C写了,可以面向更多用户
链表的回文结构_牛客题霸_牛客网 (nowcoder.com)

简单的想想整形我们怎么比较,就是将整形A 依次取尾,放到整形B中。
- int a = 121;
- int t = a;
- int b = 0;
- while(t)
- {
- int temp = t % 10;
- b = b*10+temp;
- t /= 10;
- }
- if(b == a)
- {
- printf("Yes");
- }
-
这里我们也借用这个思路,先遍历一遍链表,取出每个节点的val,放到整形A中,在将链表翻转,再次取出每个节点的val,放到整形B中,进行比较。
- struct ListNode {
- int val;
- struct ListNode *next;
- ListNode(int x) : val(x), next(NULL) {}
- };
- class PalindromeList {
- public:
- bool chkPalindrome(ListNode* A) {
- // write code here
- int ret1 = 0; //原链表
- int ret2 = 0;
- struct ListNode* n1 = NULL;
- struct ListNode* n2 = A;
- struct ListNode* n3 = A->next;
- while(n2)
- {
- ret1 = ret1 * 10 + n2->val;
- n2->next = n1;
- n1 = n2;
- n2 = n3;
- n3 = n3->next;
- }
- while(n1)
- {
- ret2 =ret2* 10 + n1->val;
- n1 = n1->next;
- }
- if(ret1 == ret2)
- {
- return true;
- }
- return false;
- }
- };
这里的思路,是在思路一的基础上,在进了一步,让链表从中间到尾进行翻转,进行比较。


- struct ListNode {
- int val;
- struct ListNode *next;
- ListNode(int x) : val(x), next(NULL) {}
- };
- class PalindromeList {
- public:
- //找出中间节点
- ListNode* MiddleList(ListNode* phead)
- {
- ListNode* fast = phead;
- ListNode* slow = phead;
- while(fast && fast->next)
- {
- fast = fast->next->next;
- slow=slow->next;
- }
- return slow;
- }
- //将中间节点到尾节点逆置
- ListNode* ReverseList(ListNode* phead)
- {
- ListNode* n1 = NULL;
- ListNode* n2 = phead;
- ListNode* n3 = phead->next;
- while(n2)
- {
- n2->next = n1;
- n1 =n2;
- n2 =n3;
- n3 = n3->next;
- }
- return n1;
- }
- bool chkPalindrome(ListNode* phead) {
- // write code here
- ListNode* mid = MiddleList(phead);
- ListNode* rev = ReverseList(phead);
- ListNode* cur =phead;
- while(cur && rev)
- {
- if(cur->val != rev->val)
- {
- return false;
- }
- cur =cur->next;
- rev =rev->next;
- }
- return true;
- }
- };