A. 单链表整体的逆转
题目链接:https://leetcode.com/problems/reverse-linked-list/
其实做法挺简单的,就是将每个节点的next指针指向原来链表中的上一个就好了,注意对NULL的处理。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *last = NULL, *now = head;
while (now != NULL) {
ListNode* nextOne = now->next;
now->next = last;
last = now;
now = nextOne;
}
return last;
}
};
B. 单链表的部分逆转
即旋转链表第m个节点到第n个节点之间的部分,逆转部分跟A的原理一样,不过要处理好左右,以及NULL的情况。
原题链接:https://leetcode.com/problems/reverse-linked-list-ii/
#include <stdio.h>
#include <assert.h>
struct ListNode {
int val;
ListNode *next;
ListNode(int x): val(x), next(NULL) {}
void append(int x) {
assert(this != NULL);
ListNode* now = this;
while (now->next != NULL)
now = now->next;
now->next = new ListNode(x);
}
void print() {
ListNode* now = this;
while (now != NULL) {
printf("%d ", now->val);
now = now->next;
}
printf("\n");
}
};
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (m == n)
return head;
ListNode *left = NULL, *right = NULL;
ListNode *left_pre = NULL, *right_next = NULL;
ListNode *now = head, *last = NULL;
for (int i = 1; now != NULL; ++i) {
if (i == m-1)
left_pre = now;
else if (i == m)
left = last = now;
else if (i == n)
right = now;
else if (i > n) {
right_next = now;
break;
}
// case i in (m, n], reverse it
if