リンクリストの例2

3:リンクリストの中央ノード

基本的な考え方:1)リンクリストは空ではないため、アサートする必要はありません

2)最適なソリューションとして高速と低速のポインターを使用し、高速と低速の2つのポインターを定義します

高速は一度に2つのステップを実行し、低速は一度に1つのステップを実行します。

3)サブシチュエーション

リンクリストの長さが奇数の場合

この時点で、ゆっくりと戻ることが必要です

ii偶数の場合

ファストポイントが空の場合、スローの位置が目的の位置であることがわかります。

コード表示

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* slow,*fast;//创建快慢指针
    slow = fast = head;//指向的都是头节点
    while(fast && fast->next)//这里注意fast必须在前,
    //因为根据&&的性质,前面为假,后面的就不看了,fast在后就会使得为奇数的情况报错
    {
        slow = slow->next;//slow一次前进一个
        fast = fast->next->next;//fast前进两个
    }
    return slow;//slow所指的即为所求
}

4:リンクリストの最後のk番目のノード

基本的な考え方:1)リンクリストが空の場合は、NULLを返します

2)高速ポインターと低速ポインターを作成しますが、高速ポインターは最初にkステップを実行し、次に高速ポインターと低速ポインターが一緒に移動し、ループを終了するための条件はfast==NULLです。

3)与えられたk値がリンクリストの長さを超えると、fastがワイルドポインタになるので、最初に行く場合はfastがワイルドポインタになるかどうかを判断する必要があります。

描く:

コード表示:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    struct ListNode* slow,*fast;//创建快慢指针
    slow = fast = pListHead;//指针初始指向头节点
    while(k--)//fast先走k步
    {
        if(fast == NULL)//给定的k的值超过了链表的长度
        {
            return NULL;//返回NULL
        }
        fast = fast->next;//更新fast
    }
    while(fast)//fast为空结束循环
    {
        slow = slow->next;
        fast = fast->next;//fast和slow都走一步
    }
    return slow;//返回slow节点
}

これらの2つの質問は高速ポインタと低速ポインタに適用されますが、実装手法が異なるため、別のブログを作成します。フォローアップにはリンクリストの他の例があり、次々にリリースされます。 。

おすすめ

転載: blog.csdn.net/weixin_61932507/article/details/123699846