Description
You are given the head
of a linked list, and an integer k
.
Return the head of the linked list after swapping the values of the kth
node from the beginning and the kth
node from the end (the list is 1-indexed).
Example 1:
Input: head = [1,2,3,4,5], k = 2 Output: [1,4,3,2,5]
Example 2:
Input: head = [7,9,6,6,7,8,3,0,9,5], k = 5 Output: [7,9,6,6,8,7,3,0,9,5]
Constraints:
- The number of nodes in the list is
n
. 1 <= k <= n <= 105
0 <= Node.val <= 100
Code
One pass
Time Complexity: , Space Complexity:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapNodes(struct ListNode* head, int k) {
struct ListNode* front = head;
struct ListNode* runner = head;
struct ListNode* back = head;
for(int i = 0; i < k; i++) {
front = runner;
runner = runner->next;
}
while(runner) {
back = back->next;
runner = runner->next;
}
int temp = front->val;
front->val = back->val;
back->val = temp;
return head;
}
/**
* 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* swapNodes(ListNode* head, int k) {
ListNode* front = nullptr, *back = nullptr;
for(auto p = head; p != nullptr; p = p->next) {
back = back == nullptr ? nullptr : back->next;
if(--k == 0) {
front = p;
back = head;
}
}
swap(back->val, front->val);
return head;
}
};