链表的常见操作:反转,两两反转,以k为单位进行反转

it2024-12-30  17

剑指 Offer 24. 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

思路:无

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { ListNode* m1=NULL; ListNode* m2=head; if(m2==NULL) { return m2; } ListNode* m3=m2->next; while(m2!=NULL) { m2->next=m1; m1=m2; m2=m3; if(m3!=NULL) { m3=m3->next; } } return m1; } };

leetcode 24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

**思路:**比较简单 有四个指针 pre,start,end,next

代码:

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode node(1); ListNode* dumpy=&node; dumpy->next=head; ListNode* pre=dumpy; while(pre->next!=nullptr&&pre->next->next!=nullptr) { ListNode* start=pre->next; ListNode* end=pre->next->next; ListNode* next=end->next; end->next=start; start->next=next; pre->next=end; pre=start; } return dumpy->next; } };

25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

思路:这题用到了前面链表反转

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { private: ListNode* link_reverse(ListNode* low)//将链表进行翻转 { ListNode* m1=nullptr; ListNode* m2=low; if(m2==nullptr) { return m2; } ListNode* m3=m2->next; while(m2!=nullptr) { //将下一个节点指向当前节点 m2->next=m1; m1=m2; m2=m3; if(m3!=nullptr) { m3=m3->next; } } return m1; } public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode node(1); ListNode* pre,*start,*end,*next; ListNode * dummpy=&node; pre=dummpy; dummpy->next=head;//返回值,其实要dummpy->next; start=end=head; while(end!=nullptr) { for(int i=1;i<k&&end!=nullptr;i++)//画一画就知道为啥是i<k了 { end=end->next; } if(end==nullptr)//此次长度没有到k,可以直接返回 { break; } next=end->next; end->next=nullptr; link_reverse(start);//链表里面进行反转 记住现在start在链表尾部了,end链表头部了 //开始将链表插入到pre 和next之间 pre->next=end; start->next=next; //重新将pre,start,end进行赋值 pre=start; start=next;//下一个k节点的首部 end=next;下一个k节点的首部 } return dummpy->next; } };
最新回复(0)