單鏈表的逆置和從尾到頭列印單鏈表
從尾到頭列印單鏈表:遞迴法。先宣告一個節點為頭結點(cur = *head),當cur->next為空時,輸出列印cur節點。否則,就一直呼叫該節點。
單鏈表逆置:頭插法。即刪掉頭結點的下一個節點,然後把刪掉的節點進行該連結串列的頭插。例如:
這樣,就可以把節點b插到a的前面。以此類推,知道cur->next==NULL為止。
單鏈表逆置還有一種方法:初始化3個節點,然後按照順序以此進行交換賦值。
實現的程式碼如下:(在3個檔案中編寫的)
LinkListTest.h檔案
#pragma once #define TextHeader printf("\n********************%s**********************\n",__FUNCTION__) typedef char ElemType; typedef struct LinkListT { ElemType data; struct LinkListT* next; }LinkListT; LinkListT* head; //初始化單鏈表 void LinkListT_Init(LinkListT** head); //列印連結串列 void DisplayLinkListT(LinkListT* head); //建立一個節點 LinkListT* CreateNode(ElemType value); //銷燬節點 void DestroyNode(LinkListT* del); //頭插 void LinkListT_PushFront(LinkListT** head,ElemType value);
//從尾到頭列印單鏈表
void LinkListT_ReversePrint(LinkListT* head);
//單鏈表逆置
void LinkListTReverse(LinkListT** head);
void LinkListTReverse2(LinkListT** head);
#include"LinkListTest.h" #include<stdio.h> #include<stdlib.h> #include<stddef.h> //初始化 void LinkListT_Init(LinkListT** head) { if(head == NULL) { //非法輸入 return; } *head = NULL; } //列印連結串列 void DisplayLinkListT(LinkListT* head) { LinkListT* cur = head; if(head == NULL) { printf("空連結串列。\n"); return; } for(cur = head;cur != NULL;cur = cur->next ) { printf("【 %c:%p 】->",cur->data ,cur); } printf(" NULL "); printf("\n\n"); } //建立節點 LinkListT* CreateNode(ElemType value) { LinkListT* new_node = (LinkListT*)malloc(sizeof(LinkListT)); new_node->data = value; new_node->next = NULL; return new_node; } //頭插 void LinkListT_PushFront(LinkListT** head,ElemType value) { LinkListT* cur = NULL; if(head == NULL) { //非法輸入 return; } if(*head == NULL) { *head = CreateNode(value); return; } cur = CreateNode(value); cur->next = (*head); (*head) = cur; } void DestroyNode(LinkListT* del) { free(del); }
//從尾到頭列印單鏈表
void LinkListT_ReversePrint(LinkListT* head)
{
LinkListT* cur = head ;
if(cur->next != NULL)
{
LinkListT_ReversePrint(head->next );
}
printf("【 %c:%p 】",cur->data ,cur);
}
//單鏈表逆置 void LinkListTReverse(LinkListT** head) { LinkListT* cur = *head; LinkListT* new_node = NULL; ElemType node; if(head == NULL) { //非法輸入 return; } if(*head == NULL) { //空連結串列 return; } while(cur->next != NULL) { new_node = cur->next ; node = cur->next->data ; cur->next = new_node->next ; DestroyNode(new_node); new_node = NULL; LinkListT_PushFront(head,node); } } void LinkListTReverse2(LinkListT** head) { LinkListT* pre; LinkListT* cur = (*head); LinkListT* nex = cur->next ; if(head == NULL) { //非法輸入 return; } if(*head == NULL) { //空連結串列 return; } while(nex != NULL) { pre = cur; cur = nex; nex = nex->next ; cur->next = pre; } nex = (*head); nex->next = NULL; (*head) = cur; }
下面是測試程式碼:
void TEST_ReversePrint()
{
TextHeader;
LinkListT_Init(&head);
LinkListT_PushBack(&head,'a');
LinkListT_PushBack(&head,'b');
LinkListT_PushBack(&head,'c');
LinkListT_PushBack(&head,'d');
LinkListT_PushBack(&head,'e');
DisplayLinkListT(head);
LinkListT_ReversePrint(head);
}
void TEST_Reverse() { TextHeader; LinkListT_Init(&head); LinkListT_PushBack(&head,'a'); LinkListT_PushBack(&head,'b'); LinkListT_PushBack(&head,'c'); LinkListT_PushBack(&head,'d'); LinkListT_PushBack(&head,'e'); DisplayLinkListT(head); LinkListTReverse(&head); DisplayLinkListT(head); } void TEST_Reverse2() { TextHeader; LinkListT_Init(&head); LinkListT_PushBack(&head,'a'); LinkListT_PushBack(&head,'b'); LinkListT_PushBack(&head,'c'); LinkListT_PushBack(&head,'d'); LinkListT_PushBack(&head,'e'); DisplayLinkListT(head); LinkListTReverse2(&head); DisplayLinkListT(head); }
#include"LinkListTest.h" #include<stdio.h> int main() { TEST_ReversePrint(); TEST_Reverse(); TEST_Reverse2(); return 0; }
相關推薦
單鏈表的逆置和從尾到頭列印單鏈表
從尾到頭列印單鏈表:遞迴法。先宣告一個節點為頭結點(cur = *head),當cur->next為空時,輸出列印cur節點。否則,就一直呼叫該節點。單鏈表逆置:頭插法。即刪掉頭結點的下一個節點,然後把刪掉的節點進行該連結串列的頭插。例如:這樣,就可以把節點b插到a的前
劍指offer(面試題五)--從尾到頭列印單鏈表
程式碼如下(遞迴實現): /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { *
從尾到頭列印單鏈表 遞迴及非遞迴實現
思路一:陣列法 構建一個Datatype型別的陣列,將單鏈表所有的資料儲存下來, 再將陣列倒序輸出就可以。 缺點:相對於較長單鏈表不適合,對於較短單鏈表浪費資源 void printlist(LinkNode* head)
從尾到頭列印單鏈表(C語言)
void PrintListTailToHead(PSListNode pHead) { if (NULL != pHead) { //遞迴實現 Prin
連結串列經典面試題之從尾到頭列印單鏈表
題目: 要求將一無頭單鏈表的節點從尾到頭打印出來。這是一道經典的面試題,今天我們來介紹它的五種解決方法。1 解決思路: 定義兩個指標,一個指向連結串列頭(pcur),一個指向每次要列印的節點(pprint)。每次讓pcur來遍歷,程式碼實現如下://從尾到頭列印單鏈表
從尾到頭列印單鏈表(遞迴與非遞迴)
非遞迴演算法: 首先定義兩個尾指標tail1和tail2,遍歷連結串列使tail1指向連結串列的尾節點,然後輸出資料,再使tail2等於tail1記錄該節點,第二次遍歷時使tail1指向tail2的前一個節點,輸出資料,依次類推完成列印。 遞迴演算法:
用C++實現單鏈表的建立、逆置和輸出
題目描述:在已知單鏈表頭節點的情況下,設計演算法逆置單鏈表並輸出 方法一:採用首先將頭節點指向空,讓其變為尾節點,然後利用中間節點 p、q 將其後的節點一個接一個改為指向前面的節點 /******
藉助於棧結構將一個單鏈表逆置
藉助於棧結構將一個單鏈表逆置。 輸入輸出樣例:1組 #1 樣例輸入: 5 //連結串列中有幾個元素 1 2 3 4 5 //連結串列中的元素分別是什麼 樣例輸出: 5 4 3 2 1 //逆置後輸出,利用棧結構 #include <stdio.h>
2.3從尾到頭輸出單鏈表每個結點的值
這個可以用棧來實現,遍歷單鏈表,將數值存到棧上,遍歷完之後,再輸出棧中的資料 能用棧解決,就可以聯想到使用遞迴來解決了,每當訪問一個結點,先遞迴輸出他後面的結點,然後再輸出本身,這樣連結串列就反向輸出了。 //從尾到頭輸出結點說的值 #include <iostre
藉助棧實現單鏈表逆置
這是C語言標準版吧,不涉及C++中的&引用. 程式碼: #include <stdio.h> #include <stdlib.h> #include <string.h> #define OK 1 #define ER
【資料結構】單鏈表—逆置單鏈表
題目:定義一個函式,輸入一個連結串列的頭結點,反轉該連結串列並返回反轉連結串列後的頭結點。 我們可以藉助圖來分析一下: 我們定義一個新的頭結點為head,將begin指向head->_next,當begin不為空的時候,tmp = begin,be
單鏈表---兩種方法簡單實現單鏈表逆置
方法一: 反轉前後指標,通過建立三個指標的移動,將兩兩相鄰的結點依次進行反轉。 //單鏈表的逆置---相鄰指標 PNode ReverseList(PNode pHead) { PNode
單鏈表相關(1)從尾到頭列印連結串列、刪除一個無頭連結串列的非尾結點
1、從尾到頭列印連結串列 2、刪除一個無頭連結串列的非尾結點 單鏈表結構以及Find函式參見 2016-1-2 13:56 發表部落格 void Print_T_to_H(SListNode*&am
Java語言 從尾到頭輸出單鏈表
push rev tac pri empty null sta cnblogs blog 方法1:https://www.cnblogs.com/sgbe/p/10717861.html 方法2:用棧 public static Node1 printRevers(No
第五十八題(從尾到頭輸出鏈表)
urn stream 尾到頭 csdn ext fontsize 方法 name html 58.從尾到頭輸出鏈表。 題目:輸入一個鏈表的頭結點,從尾到頭反過來輸出每一個結點的值。 思路:題不難,提供幾種思路 1.使用棧的先進後出特性實現,遍歷鏈表元素依次入棧,再出棧
劍指-OFFER_5 輸入一個連結串列的頭節點,從尾到頭列印連結串列每個節點的值。
題源: 輸入一個連結串列的頭節點,從尾到頭列印連結串列每個節點的值。 package Chap2; /** * 輸入一個連結串列的頭節點,從尾到頭列印連結串列每個節點的值。 */ imp
SAP ABAP將內表資料匯出到TXT和從TXT讀取到內表
*&---------------------------------------------------------------------**& Report ZCMH0010*&*&--------------------------------------------
稀疏矩陣的訪問、普通逆置和快速逆置、還原輸出以及加法
首先稀疏矩陣的概念: 在一個矩陣中(並不要求為方陣)無效元素的個數遠遠大於有效元素的個數,我們稱之為——稀疏矩陣。一般沒有一個明確的界限分開稀疏矩陣和普通矩陣,不過一些人認為:有效元素的個數/無效元素的個數<0.05即可稱之為稀疏矩陣。 跟
【劍指Offer】從尾到頭列印連結串列(連結串列的逆序輸出)
目錄 題目描述 題目描述 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 解法一:使用棧 單向連結串列的逆序輸出,我們可以很容易的想到使用一個棧作為輔助,棧的先進後出的特效能幫到我們大忙。(所以基礎的資料結構是真的很重要)
前端常見演算法面試題之 - 從尾到頭列印連結串列[JavaScript解法]
前端常見演算法面試題之 - 從尾到頭列印連結串列[JavaScript解法] 題目描述 實現思路 程式碼實現 題目描述 輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值 實現思路 前端工程師看到這個題目,直接想到的就是