剑指 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; } };