24. 两两交换链表中的节点
思路:略
效率:
程序代码:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* tmp1 = head;//指向开头的指针
if (!head) return NULL;
ListNode* tmp2 = tmp1->next;
int tmp;//用于交换的中间变量,整形
while (tmp1) {//只要tmp1不等于空,那么tmp2就不等于空,所以才按照这样的顺序写
tmp2 = tmp1->next;
tmp = tmp1->val;
tmp1->val = tmp2->val;
tmp2->val = tmp;
tmp1 = tmp2->next;
}
return head;
}
ListNode* create(vector<int> nums) {//创建一个链表
ListNode* start = new ListNode(0);//先创建一个头结点
ListNode* tmp = start;
int m = nums.size();
int i = 0;
while (i < m) {
ListNode *m = new ListNode(nums[i]);//创建一个结点
tmp->next = m;
tmp = tmp->next;
m->next = NULL;
i++;
}
start = start->next;
return start;//返回头部结点
}
void show(ListNode* head) {
ListNode* a = head;//表示头结点
while (a) {
cout << a->val<<"***";
a = a->next;
}
cout << endl;
}
};
int main() {
int n;
cin >> n;//n表示节点的个数
vector<int> vec(n);
for (int i = 0; i < n; i++) {
cin >> vec[i];
}
Solution bb;
ListNode* a = bb.create(vec);
bb.show(a);
ListNode *c = bb.swapPairs(a);
bb.show(c);
return 0;
}
经过测试,程序运行结果没有问题,但是没法通过官网上的测试,因为我是采用的交换相邻系结点数值的方法而不是真正交换了结点,没有按照题目要求进行。
改进版程序代码:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* tmp1 = head;//指向开头的指针
if (!head) return NULL;
ListNode* tmp2 = tmp1->next;
ListNode* tmp = tmp2;//这个
ListNode *p = NULL;//初始是空指针
while (tmp1) {//只要tmp1不等于空,那么tmp2就不等于空,所以才按照这样的顺序写
tmp2 = tmp1->next;
if (tmp2->next)
tmp1->next = tmp2->next;
else tmp1->next = NULL;
tmp2->next = tmp1;
if (p)
p->next = tmp2;
p = tmp1;
if (tmp1->next)
tmp1 = tmp1->next;//纠正一下位置
else tmp1 = NULL;
}
return tmp;//这个才是头结点
}
ListNode* create(vector<int> nums) {//创建一个链表
ListNode* start = new ListNode(0);//先创建一个头结点
ListNode* tmp = start;
int m = nums.size();
int i = 0;
while (i < m) {
ListNode *m = new ListNode(nums[i]);//创建一个结点
tmp->next = m;
tmp = tmp->next;
m->next = NULL;
i++;
}
start = start->next;
return start;//返回头部结点
}
void show(ListNode* head) {
ListNode* a = head;//表示头结点
while (a) {
cout << a->val<<"***";
a = a->next;
}
cout << endl;
}
};
int main() {
int n;
cin >> n;//n表示节点的个数
vector<int> vec(n);
for (int i = 0; i < n; i++) {
cin >> vec[i];
}
Solution bb;
ListNode* a = bb.create(vec);
bb.show(a);
ListNode *c = bb.swapPairs(a);
bb.show(c);
return 0;
}
改进之后仍然没法正确运行,虽然在vs上面都可以正确运行,我也不知道为啥。
再次改进版(通过)
丫的!!!!
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* tmp1 = head;//指向开头的指针
if (!head) return NULL;
ListNode* tmp2 = tmp1->next;
if(!tmp2) return head;
ListNode* tmp = tmp2;//这个
ListNode *p = NULL;//初始是空指针
while (tmp1&&tmp1->next&&tmp1->next->next) {//只要tmp1不等于空,那么tmp2就不等于空,所以才按照这样的顺序写
tmp2 = tmp1->next;
tmp1->next = tmp2->next;
tmp2->next = tmp1;
if (p)
p->next = tmp2;
p = tmp1;
tmp1 = tmp1->next;//纠正一下位置
}
//再交换最后两个结点
if(!p&&tmp1&&tmp2){
tmp2->next=tmp1;
tmp1->next=NULL;
}
if(p&&tmp1->next){
p->next = tmp1->next;
p->next->next = tmp1;
tmp1->next = NULL;
}
return tmp;//这个才是头结点
}
};
61. 旋转链表
思路:一步一步进行移动
注意:要先对k进行处理,除去没必要进行的移动
效率:50+%
程序代码:
//61. 旋转链表
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if (!head) return NULL;//这种讨厌的边界条件
ListNode* tmp = head;
int len = 0;
while (tmp) {
len++;
tmp = tmp->next;
}
tmp = head;//重新引导
k = k % len;
for (int i = 0; i < k; i++) {//执行k步
Haha(tmp);
}
return head;
}
void Haha(ListNode* tmp) {//表示移动一步的结果
int a = 0, b = 0;
ListNode* m = tmp;//表示头节点
while (tmp) {//表示这个指针有意义
b = tmp->val;
tmp->val = a;
a = b;
tmp = tmp->next;
}
m->val = a;//对头结点进行赋值
}
ListNode* create(vector<int> nums) {//创建一个链表
ListNode* start = new ListNode(0);//先创建一个头结点
ListNode* tmp = start;
int m = nums.size();
int i = 0;
while (i < m) {
ListNode *m = new ListNode(nums[i]);//创建一个结点
tmp->next = m;
tmp = tmp->next;
m->next = NULL;
i++;
}
start = start->next;
return start;//返回头部结点
}
void show(ListNode* head) {
ListNode* a = head;//表示头结点
while (a) {
cout << a->val << "***";
a = a->next;
}
cout << endl;
}
};
int main() {
int m,k;//表示节点的个数
cin >> m>>k;
vector<int> vec(m);
for (int i = 0; i < m; i++) {
cin >> vec[i];
}
Solution bb;
ListNode* head = bb.create(vec);
bb.show(head);
ListNode* a = bb.rotateRight(head,k);
bb.show(head);
return 0;
}
///程序运行时显示超时了,给出的样例[1,2,3]
//2000000000,原来进行了很多没有必要的循环奥,先对k进行处理