毎日の読書ノート-反転リンクリストⅠ
2020年8月3日(月)、新入生の夏休みの途中で、自習データ構造に興味を持ち、基本的な操作を再現しましたが、それでもほとんど見えないと感じたので、Leetcodeのブラッシングを始めることにしました。質問を数日間ブラッシングして(数日間回答を読んだ後)、関連する問題解決ガイドの記事もたくさん読みましたが、それでも印象が十分に深くないと感じたので、書き始めることにしました。問題についてのメモ、ブレーンストーミング、および問題を解決するための私自身のアイデアを書き留めます。
免責事項:この記事は、深化と統合、学習とコミュニケーションにのみ使用されるオンラインの問題解決ガイド記事を参照しています。私のレベルは限られています。記事に誤りがある場合は、批判して修正してください。非営利の再版写真はすべてソースを示しています。侵害がある場合は、プライベートチャットの連絡先を削除してください。
方法1:
ダブルポインター反復方法:preとcurの2つのポインターを初期化し、反復ごとに現在のノードポインター(cur)が前のノードを指すようにします( pre)
(現在のノードの次のノードを事前に保存することを忘れないでください)場所)
画像ソース
リンク①C++の実装
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL;
ListNode* cur = head;
while(cur)
{
ListNode* temp = cur->next;// 提前保存好当前节点的下一节点
cur->next = pre; // 当前节点的指针指向前驱节点
pre = cur; //更新前驱节点
cur = temp; //cur指向原来的下一节点
}
return pre;
}
};
②Pythonの実装
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
pre = None
cur = head
while cur:
temp = cur.next # 提前保存好当前节点的下一位
cur.next = pre # 当前节点的指针指向前驱节点
pre = cur #更新pre
cur = temp # cur指向原来的下一位
return pre
Pythonの別の方法-マルチライティングの割り当て:現在のノードの次のステップへのポインタを保存するためにそのプロパティを使用することを省略できます、非常に巧妙に書かれています、興味があるのはこの記事の下を見てください、それ以上の説明はありません
Python yuan Assignment
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head:ListNode) -> ListNode:
"""
:type head: ListNode
:rtype: ListNode
"""
pre = None
cur = head
while cur:
cur.next,pre,cur= pre,cur,cur.next
return pre
方法2:再帰
関数を再帰的に呼び出し、リンクリストの最後のノード(反転後のヘッドノード)に再帰します(retとして示されます)。
再帰の終了条件:
if(head == NULL || head->next == NULL)
return head;
その後、関数が戻るたびに、現在のノードの次のノードの次のポインタが現在のノードを指すようになり、現在のノードの次のポインタがNULLを指すようになり、パーシャルを実現します。リンクリストの末尾からの反転(1-> 2は1 <-2に変換されます)
すべての再帰関数がスタックから外れると、リンクリストが反転されて
画像ソースリンク
①C++の実装が完了します。
ListNode* reverseList(ListNode* head) {
//到链表尾节点结束,返回作为反转链表的头节点
if(head == NULL || head->next == NULL)
return head;
//递归调用直到满足结束条件,返回
ListNode* ret = reverseList(head->next);
//注意我们的递归调用入口参数:head->next,也就是下面代码中的head
//第几次调用,递归调用返回后 head就指向第几个节点
//接下来:当前节点的下一个节点的后驱指针指向当前节点(有点别扭)
//简单的说就是 1->2 我们需要实现1<-2,
//head指向的是1,那么head->next就是2,2的next指向1,就实现我们的目的啦
head->next->next = head;
head->next = NULL;
return ret;
}
②Pythonの実装、考え方は上記と同じなので、ここでは繰り返しません
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head
ret = self.reverseList(head.next)
head.next.next = head
head.next = None
return ret