Leetcode 1721. 交换链表中的节点

给你链表的头节点 head 和一个整数 k 。

交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[1,4,3,2,5]

示例 2:

输入:head = [7,9,6,6,7,8,3,0,9,5], k = 5
输出:[7,9,6,6,8,7,3,0,9,5]

示例 3:

输入:head = [1], k = 1
输出:[1]

示例 4:

输入:head = [1,2], k = 1
输出:[2,1]

示例 5:

输入:head = [1,2,3], k = 2
输出:[1,2,3]

提示:

  • 链表中节点的数目是 n
  • 1 <= k <= n <= 105
  • 0 <= Node.val <= 100

思路1:首先p,q两个指针都初始化指向head,然后将p指针前进k-1步,使用指针t保存正向第k个节点位置,之后p,q指针一起向前走直到p指针的下个结点为空时,q即为反向第k个结点位置,交换t,q指针的值即可.

/**
 * 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* p=head,*q=head,*t=NULL;
              k--;
              while(k--){
                  p=p->next;
              }
              t=p;
              while(p->next!=NULL){
                 q=q->next;
                 p=p->next;
             }
             swap(q->val,t->val);
            return head;
    }
};

思路二: 直接不当人,把链表内容拷贝到新建数组中,直接交换数组第k个和倒数第k个的值.

/**
 * 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:
    vector<int> nums;
    ListNode* swapNodes(ListNode* head, int k) {
            for(auto p=head;p;p=p->next){
                nums.push_back(p->val);
            }
            swap(nums[k-1],nums[nums.size()-k]);
            int i=0;
             for(auto p=head;p;p=p->next){
                p->val=nums[i++];
            }
            return head;
    }
};

猜你喜欢

转载自blog.csdn.net/wd2ctp88/article/details/112520455