MyLinkedList() { head = new ListNode(0); size = 0; } intget(int index){ if (index < 0 || index >= size) return-1;
auto p = head->next; // p赋值为首节点 while (index --){ // inde = 0也能处理,如果--index就会死循环 p = p->next; } return p->val; } voidaddAtHead(int val){ auto t = new ListNode(val); t->next = head->next; head->next = t; size ++; } voidaddAtTail(int val){ auto p = head; while (p->next) p = p->next;
auto t = new ListNode(val); p->next = t; size ++; } voidaddAtIndex(int index, int val){ if (index > size) return; elseif (index <= 0) addAtHead(val); else{ auto t = new ListNode(val); auto p = head; while (index --){ p = p->next; } t->next = p->next; p->next = t; } size ++; } voiddeleteAtIndex(int index){ if (index < 0 || index >= size) return; auto p = head; while (index--){ p = p->next; } auto t = p->next; p->next = p->next->next; delete t; size --; } };
public: MyLinkedList() { size = 0; head = tail = new ListNode(0); head->next = tail,tail->prev = head; } intget(int index){ if (index < 0 || index >= size) return-1;
auto p = head->next; while (index --){ p = p->next; } return p->val; } voidaddAtHead(int val){ auto t = new ListNode(val); t->next = head->next; t->prev = head; head->next->prev = t; head->next = t;
size ++; } voidaddAtTail(int val){ auto t = new ListNode(val); t->next = tail; t->prev = tail->prev; tail->prev->next = t; tail->prev = t;
size ++; } voidaddAtIndex(int index, int val){ if (index > size) return; elseif (index <= 0) addAtHead(val); else{ auto p = head; auto t = new ListNode(val); while (index --){ p = p->next; } t->next = p->next; t->prev = p; p->next->prev = t; p->next = t; }
size ++; } voiddeleteAtIndex(int index){ if (index < 0 || index >= size) return;
auto p = head; while (index --){ p = p->next; } auto t = p->next; p->next = t->next; t->next->prev = p; delete t;
// 题解一: classSolution { private: vector<int> a; public: boolisPalindrome(ListNode* head){ for (ListNode* p = head;p ;p = p->next) a.push_back(p->val);
bool flag = true; for (int l = 0,r = a.size()-1;l < r;l ++,r --){ // 注意不要写成l != r,偶数个节点时这是错的! if (a[l] != a[r]){ flag = false;break;} }
if (flag) returntrue; elsereturnfalse; } }; ---------------------------------------------- // 题解二:关于链表的翻转参考考研算法辅导课---重排链表,参考自y总视频 classSolution { public: boolisPalindrome(ListNode* head){ int n = 0; for (auto p = head ;p ;p = p->next) n ++; // 计算节点个数 if (n <= 1) returntrue;
auto a = head; // 编号0~n/2 - 1放在左侧链表 for (int i = 0;i < n/2 - 1;i ++){ a = a->next; }
auto t = a->next;// 编号n/2 - 1作为右侧链表的最后一个节点 auto b = t->next; a->next = t->next = nullptr; while (b){ // 翻转链表 auto c = b->next; b->next = t; t = b,b = c; }
auto x = t;auto y = head; bool flag = true; // 双指针判断回文 for (int i = 0;i < n/2;i ++){ if (x->val != y->val){ flag = false;break; } x = x->next,y = y->next; } // 恢复链表,只考虑算法题可以不加,工程上最后恢复原状 auto tail = t; auto p = tail->next; tail->next = nullptr; while (p){ auto c = p->next; p->next = tail; tail = p,p = c; } a->next = tail;
if (flag) returntrue; elsereturnfalse; } }; ---------------------------------------------- // 题解三:快慢指针 classSolution { public: boolisPalindrome(ListNode* head){ ListNode* prev = NULL; auto fast = head; // 快指针一次走两步,慢指针一次走一步 auto slow = head; // 当快指针走到尾时慢指针走到中间位置(偶数个时偏右边) while (fast != NULL && fast->next != NULL){ fast = fast->next->next; ListNode *temp = slow->next; slow->next = prev; // 翻转前半链表 prev = slow; slow = temp; }