leetcode力扣刷题打卡
题目:1721. 交换链表中的节点
描述:给你链表的头节点 head 和一个整数 k 。
交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。
解题思路
1、用数组存储链表节点,用下标定位两个目标节点,然后交换;
2、双指针也行,见代码2。
原代码1##
class Solution {
public:
ListNode* swapNodes(ListNode* head, int k) {
vector<ListNode *>v;
ListNode *p = new ListNode(-1);
ListNode *pp = p;
int n = 0;
while (head) {
v.emplace_back(head);
head = head->next;
}
n = v.size();
int val = v[k - 1]->val;
v[k - 1]->val = v[n - k]->val;
v[n - k]->val = val;
for (int i = 0; i < n; ++i) {
p->next = v[i];
p = p->next;
}
p->next = nullptr;
return pp->next;
}
};
原代码2##
class Solution {
public:
ListNode* swapNodes(ListNode* head, int k) {
ListNode *fast = head;
for (int i = 1; i < k; ++i) {
fast = fast->next;
}
ListNode *temp = fast;
ListNode *slow = head;
while (fast->next != nullptr) {
fast = fast->next;
slow = slow->next;
}
swap(slow->val, temp->val);
return head;
}
};