数据结构复习到了链表,顺便也把这个题解了
leet上最快的解题是把链表的内容复制到数组,然后从数组两端比较
我的解法只使用了链表,所以会慢于数组解法
思路:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode* reverse_list(struct ListNode *list)
{//abc -> cbastruct ListNode *tail = list;struct ListNode *ptr = list;struct ListNode *fast;while(tail->next != NULL)tail = tail->next;while(ptr != tail){fast = ptr->next;ptr->next = tail->next;tail->next = ptr;ptr = fast;}return tail;
}
bool processing(struct ListNode *list,const int length)
{if(list == NULL)return false;bool re = true;struct ListNode *slow = list;struct ListNode *fast = list;if((length & 1) == 0)fast = fast->next;//提前走一步 为了找到tailwhile (fast->next != NULL){slow = slow->next;fast = fast->next->next;}struct ListNode *middle_left = slow;slow = slow->next; //中后的第一个位置struct ListNode *new_head = reverse_list(slow);slow = new_head;fast = list;while (slow != NULL){if (slow->val != fast->val){re = false;break;}slow = slow->next;fast = fast->next;}//恢复listnew_head = reverse_list(new_head);middle_left->next = new_head;return re;
}
bool isPalindrome(struct ListNode* head) {struct ListNode* ptr = head;int length=0;while(ptr!=NULL){++length;ptr = ptr->next;}if(length<=1)return true;return processing(head,length);}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态