單向連結串列反轉(倒置)問題
今天遇到單向連結串列的反轉的問題,於是靜下心來好好想了一番。
解題思路如下圖:
假設當前建立好的連結串列如下:
首先讓頭節點與第一個元素節點斷開,但是要注意在斷開之前需要用p指標指向第一個元素節點來儲存第一個元素節點的位置,然後再斷開。在這裡有一個指標q指向一個指標域為空的節點,這個節點用來做為連結串列反轉後的最後一個節點。
讓第二個元素節點的指標從指向第三個元素節點變為指向第一個元素節點,以此類推,直至指標p指向原連結串列最後一個元素。
p指標指向NULL時,讓原頭節點的指標域指向原來最後一個元素節點。此時連結串列倒置已完成。
程式碼如下:
linkList reverse(linkList head){
linkList p,q,pr;
p = head->next ;
q = NULL;
head->next = NULL;
while(p){
pr = p->next;
p->next = q;
q = p;
p = pr;
}
head->next = q;
return head;
}
相關推薦
單向連結串列反轉(倒置)問題
今天遇到單向連結串列的反轉的問題,於是靜下心來好好想了一番。 解題思路如下圖: 假設當前建立好的連結串列如下: 首先讓頭節點與第一個元素節點斷開,但是要注意在斷開之前需要用p指標指向第一個元素節點來儲存第一個元素節點的位置,然後再斷開。在這裡有一個指標
單向連結串列反轉,就地逆置與遞迴反轉(無表頭結點)
最近在看連結串列,今天刷到一道連結串列的反轉題,連結串列反轉可以說是基礎操作,但是可提供的方案也有很多,簡單通過了該題後又學習了一下遞迴反轉,現在把三種方法都公開出來做一個總結。 1.就地逆置 2.單引數的遞迴逆置 3.雙引數的遞迴逆置 一、就地逆置 方法:頭插。 由於這裡是不帶表頭結點的單向連結串列,所以頭
【日拱一卒】連結串列——連結串列反轉(遞迴解法)
前言 上篇我們主要介紹連結串列反轉的原地反轉解法。 除此以外,是否還有其他解法? 當然,今天就來看看連結串列反轉的遞迴解法。 遞迴 遞迴,字面意思,有”遞“也有”歸“ 拿我們經常聽到的斐波那契數列來說,公式如下 f(n) = f(n-1) + f(
一文讀懂連結串列反轉(迭代法和遞迴法)
單向連結串列反轉的方法有很多,其中用的比較多的是迭代法和遞迴法,迭代法通俗易懂,遞迴法相對來說比較難理解一些。 最近讀了一些網上的文章對這兩種演算法的解釋後,有些自己的理解分享出來供大家參考。 單向連結串列反轉圖示: 一、迭代法 迭代法的解題思路是:通過迴圈遍歷的方式,使連結串列的每一個節點
單向連結串列反轉,k個一組
有連結串列1 2 3 4 5 6 7 8 ,3個一組反轉結果:3 2 1 6 5 4 8 7 Node* KNodeReverse(Node* root,int k) { Node *cur,*pre,*next;//必須有三個臨時指標,因為cur需要知道連線的物件,同時不丟失它的下個物件
資料結構與演算法之連結串列篇(上)
連結串列作為一種基礎的資料結構之一,我們會常常使用到它,接下來就讓我們一起學習吧。 1、連結串列的經典應用場景: LRU快取淘汰演算法。 2、快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非常廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。
資料結構與演算法之連結串列篇(下)
Q:如何輕鬆寫出正確的連結串列程式碼? 總結起來,就是投入時間+技巧; 一、投入時間: 只要願意投入時間,大多數人都是可以學會的,比如說,如果你真能花上一個週末或者一整天時間,就去寫連結
程式設計師程式碼面試指南 —— 連結串列問題(四)
題目:將單鏈表的每K個節點之間逆序 描述:給定一個單鏈表的頭結點head,實現一個調整單鏈表的函式,使得每K個節點之間逆序,如果最後不夠K個節點一組,則不調整最後幾個節點 例如: 連結串列 1—>2—>3—>4—>5—>6—>7—>8—>nul
程式設計師程式碼面試指南 —— 連結串列問題(三)
題目:複製含有隨機指標節點的連結串列 描述:有一種連結串列節點類描述如下: public class Node { public int value; public Node next; public Node rand; public Node(int data){ this.value
程式設計師程式碼面試指南 —— 連結串列問題(二)
題目:給定一個連結串列的頭節點head,請你判斷是否為迴文結構 例如:1 —> 2 —> 1 ture 1 —> 2 —> 2 —> 1 true 1 —> 2 —> 3 flase 思路:可以使用棧這種資料結構,可以將整個單向連結串列分為前半區和後
程式設計師程式碼面試指南 —— 連結串列問題(一)
注:題目來自於《程式設計師程式碼面試指南:IT名企演算法與資料結構題目最優解》,該書是左程雲老師的著作,值得推薦,這裡僅是記錄一下該書中題目的解法和個人理解 題目一:在單鏈表和雙鏈表中刪除倒數第K個節點 描述: 分別實現兩個函式,一個可以刪除單鏈表中倒數第K個節點,另一個可以刪除雙鏈
圖解單向連結串列反轉
如何把一個單鏈表進行反轉? 方法1:將單鏈表儲存為陣列,然後按照陣列的索引逆序進行反轉。 方法2:使用3個指標遍歷單鏈表,逐個連結點進行反轉。 方法3:從第2個節點到第N個節點,依次逐節點插入到第1個節點(head節點)之後,最後將第一個節點挪到新表的表尾。 方法4:
面向物件之Python的連結串列實現(二)迴圈連結串列
接上一章的練習,這裡接著實現單鏈表的變型——傳說中的迴圈單鏈表。給出一個簡單的類,構造4個功能並例項化測試。 在下一篇文章中將會關注一個比較tricky的問題:如何判斷連結串列有環?以及求出環長度 # -*- coding: utf-8 -*- """ Created
靜態記憶體分配-連結串列管理(1)單向量表講解
單向連結串列 單向量表有頭節點 和節點組成,頭節點主要是管理連結串列使用,節點組成資料。 資料結構 **last指向尾節點的Next指標,在節點尾部插入節點時,直接調整頭節點的last內容的指向即可在尾部插入。first指標指向連結串列的首節點。
連結串列求和(LintCode)
題目來源:LintCode 原題地址:http://www.lintcode.com/zh-cn/problem/add-two-numbers/ 題目: 你有兩個用連結串列代表的整數,其中每
連結串列初解(四)——佇列的入隊和出隊
自己複習了一下簡單佇列的基本操作,其中要注意的是隊頭和隊尾要始終保持位置正確~還是老習慣,上程式碼+註釋啦~ Code: #include<iostream> using namespace std; typedef struct node { int da
程式設計練習:連結串列習題(上)
(1)題目:輸入兩個連結串列,找出它們的第一個公共節點。 思路: 1)計算出連結串列1的長度; 2)計算出連結串列2的長度; 3)計算出連結串列1和連結串列2的長度差dif;
在O(1)時間複雜度刪除連結串列節點(372)
資料結構—線性結構—連結串列:(在O(1)時間複雜度刪除連結串列節點)一、題目:給定一個單鏈表中的一個等待被刪除的節點(非表頭或表尾)。請在在O(1)時間複雜度刪除該連結串列節點。樣例:Linked l
連結串列學習(3)
1、線性結構與非線性結構,主要看元素之間的關係。若是一對一關係就是線性表,如果不是一對一就是非線性。 2、LS=((a,b,c),(d,e,f)); tail(LS)=((d,e,f)); head
(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹的所有葉子及結點總數。
(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu