日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单向链表的逆置问题

發布時間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单向链表的逆置问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單鏈逆置
常見的面試題,主要考查邏輯能力。

使用歸納法來解這道題。核心是下面的reverse()函數,其主要思路如下:
把一個鏈表分為三個部分:

  • 前面是逆置完成(prev指針),
  • 當前指針指向的位置(curr指針),
  • 后面未處理的部分(next指針)。

需要注意的地方

  • 先想好循環體如何實現
    snode* next = curr->next;//后面的指針
    curr->next= prev;//逆置
    prev = curr;//指針往后挪
    curr = next;//指針往后挪

  • 再回過頭來想curr指針和prev指針的初值
    snode* prev = NULL;//想一想為什么是NULL,而不是啞結點header
    snode* curr = header->next;//第一個真實的結點

  • 最后勿忘把啞結點鏈接上
    header->next=prev;

  • 單向鏈表逆序reverse()函數

    void reverse(snode* header) {snode* prev = NULL;snode* curr = header->next;while (curr != NULL){snode* next = curr->next;//后面的指針curr->next= prev;//逆置prev = curr;//指針往后挪curr = next;//指針往后挪}header->next = prev;//很容易忘記這一步!}

    鏈表遍歷打印traverse()函數:

    //遍歷鏈表traverse void traverse(snode * header) {for (snode* p = header->next; p != NULL; p = p->next)cout << p->data << " ";cout << endl; }

    完整代碼:

    // reverse_front_list.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。#include "pch.h" #include<iostream> #include<vector>using namespace std;//結點結構體 struct snode {int data;snode* next; };//遍歷鏈表traverse void traverse(snode * header) {for (snode* p = header->next; p != NULL; p = p->next)cout << p->data << " ";cout << endl; }//逆序鏈表 void reverse(snode* header) {snode* prev = NULL;//snode* curr = header->next;while (curr != NULL){snode* next = curr->next;//后面的指針curr->next= prev;//逆置prev = curr;//指針往后挪curr = next;//指針往后挪}header->next = prev;//很容易忘記這一步!}int main() {vector<snode> V = { {}, {1, NULL}, {2, NULL}, {3, NULL} };//向量鏈接成鏈表for (size_t i = 0; i+1 < V.size(); ++i){V[i].next = &V[i+ 1];}cout << "鏈表逆序之前" << endl;traverse(&V[0]);//遍歷輸出reverse(&V[0]);//逆置cout << "鏈表逆序之后" << endl;traverse(&V[0]);//遍歷輸出return 0; }

    程序結果:

    回答問題:
    現在來回答為什么prev指針初值為NULL,而不是header。
    第一次使用prev指針是在哪里?在循環體中。

    while (curr != NULL) {snode* next = curr->next;curr->next= prev;//------------這里第一次使用prev = curr;curr = next; }

    我們從具體的分析中更好地可以得出結論。
    假設初始第一個結點數值為1,即Curr->data=1,逆置之后1就是最后一個結點,它應該指向空指針,也就是curr->next=NULL.也就是這里的prev的初值應該NULL,而不是header,因為這是單向鏈表。

    希望對你有幫助。

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的单向链表的逆置问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。