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