1、反转链表
迭代
/** * 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* pre = nullptr; ListNode* next = nullptr; ListNode* cur = head; while(cur) { next = cur->next; cur->next = pre; pre = cur; cur = next; } return pre; } };
递归
class Solution { public: ListNode* reverseList(ListNode* head) { if(head == nullptr || head->next == nullptr) return head; ListNode* ret = reverseList(head->next); head->next->next = head; head->next = nullptr; return ret; } };
2、k个一组反转链表
ListNode* reverse(ListNode* cur, ListNode* tail){ ListNode * next = nullptr; ListNode * pre = nullptr; while(cur != tail) { next = cur->next; cur->next = pre; pre = cur; cur = next; } return pre; } ListNode* reverseKGroup(ListNode* head, int k){ if(head == nullptr || head->next == nullptr) return head; ListNode* tail = head; for(int i=0; i<k; i++) { if(tail == nullptr) return head; tail = tail->next; } ListNode* dummy = reverse(head, tail); head->next = reverseKGroup(tail, k); return dummy; }