链表问题

tech2022-07-07  230

单链表反转

ListNode* reversenode(ListNode* p) { if (p == NULL || p->next == NULL) return p; ListNode* cur = p; ListNode* pre = NULL; ListNode* next = p->next; while (next) { cur->next = pre; pre = cur; cur = next; next = cur->next; } cur->next = pre; return cur; }

循环链表反转

void reverselist(ListNode* a) { ListNode* head = a; ListNode* pre = a; ListNode* cur = a->next; ListNode* next = cur->next; while (cur != head) { cur->next = pre; pre = cur; cur = next; next = cur->next; } cur->next = pre; }

反转链表中从m到n

ListNode *reversemn(ListNode* p, int m, int n) { if (p == NULL || p->next == NULL || m == n) return p; int t = n - m; ListNode* prehead = new ListNode(-1); prehead->next = p; ListNode* pre = prehead; while (m > 1) { pre = pre->next; m--; } //cur指向第m-1个节点 ListNode* dump = pre->next; pre->next = NULL; ListNode* cur = dump; while (t) { cur = cur->next; t--; } ListNode* next = cur->next; cur->next = NULL; ListNode* newd=reversenode(dump); pre->next = newd; while (newd->next) newd = newd->next; newd->next = next; return prehead->next; }

链表按照奇数或偶数拆分

void chaifen(ListNode* head) { if (head == NULL || head->next == NULL) return; ListNode* p1 = head; ListNode* p2 = head->next; while ((p1&&p1->next) || (p2&&p2->next)) { if (p1 != NULL && p1->next != NULL){ p1->next = p1->next->next; p1 = p1->next; } if (p2 != NULL && p2->next != NULL) { p2->next = p2->next->next; p2 = p2->next; } } }

143 重排链表

先找到中间节点,然后把后半段反转,然后按照流程变换链表即可。(已收藏

最新回复(0)