1. 程式人生 > 其它 >連結串列 leetcode 1721. 交換連結串列中的節點

連結串列 leetcode 1721. 交換連結串列中的節點

技術標籤:leetcode

題目內容

交換 連結串列正數第 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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/swapping-nodes-in-a-linked-list
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

c語言解答

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 * 讓我想起來了劍指offer的連結串列中的倒數第K個節點的題.遍歷一遍連結串列就行
 * 設定兩個指標,然後
 */
struct ListNode* swapNodes(struct ListNode* head, int k){ //用來計數 int count=0; //first記錄正數k節,,剛開始都指頭 struct ListNode*first=head; //second記錄倒數k節,剛開始都指頭 struct ListNode*secode=head; //用來遍歷的指標 struct ListNode*zou=head; while(zou!=NULL){ //當還沒到整數k的時候,count++ if
(count<k-1){ count++; } //當找到整數k的時候,趕快用first指標記錄下來 else if(count==k-1){ //此時這個是正數第k個位元組,然後此時zou指標再往前走一個,那麼第二個指標也將往前走 count++; first=zou; } //當count>k-1時候,zou指標往前走一步,然後second開始從第一個節點開始走,兩者間距離一直是k-1,思路和我劍指offer一樣 else{ count++; secode=secode->next; } zou=zou->next; } //交換倆指標間的值 int temp=first->val; first->val=secode->val; secode->val=temp; //返回交換好後的連結串列 return head; }

java語言解答

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapNodes(ListNode head, int k) {
        //用來計數
        int count=0;
        //first記錄正數k節,,剛開始都指頭
        ListNode first=head;
        //second記錄倒數k節,剛開始都指頭
        ListNode secode=head;
        //用來遍歷的指標
        ListNode zou=head;
        while(zou!=null){
            //當還沒到整數k的時候,count++
            if(count<k-1){
                count++;
            }
            //當找到整數k的時候,趕快用first指標記錄下來
            else if(count==k-1){
                count++;
                first=zou;
            }
            //當count>k-1時候,zou指標往前走一步,然後second開始從第一個節點開始走,兩者間距離一直是k-1,思路和我劍指offer一樣
            else{
                count++;
                secode=secode.next;
            }
            zou=zou.next;
        }
        //交換倆指標間的值
        int temp=first.val;
        first.val=secode.val;
        secode.val=temp;
        //返回交換好後的連結串列
        return head;
    }
}

總結:

如果遍歷量單獨去找倒數k節點非常的浪費時間,直接用雙指標來找,倒數k,先讓指標走到正數k位置後,然後每次指標從正數k節點位置往後走時候,記錄倒數第k個節點的指標secode才開始從head位置走,兩者開始同時走,這樣就能保證最後指標走到最後的時候secode指標位置就是倒數k的位置.