关键就是使用快慢指针法找到倒数第k个结点,最后交换正数第k个结点和倒数第k个结点的值即可.
快慢指针法:初始快慢指针都指向head,快指针先走k步,然后两个指针一起走,当快指针指向结尾null时,慢指针正好指向倒数第k个结点。
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){}
};
//快慢指针法找到倒数第k个结点 最后交换两个结点的值即可
class Solution {
public:
ListNode *swapNodes(ListNode *head ,int k) {
if(head==nullptr||head->next==nullptr)return head;
ListNode *first = head;
ListNode *second = head;
for(int i = 0;i<k-1;++i) {
first = first->next;
}
ListNode *left = first;
first = first->next;
while(first) {
first = first->next;
second = second->next;
}
int tmp = second->val;
second->val = left->val;
left->val = tmp;
return head;
}
};