1. 程式人生 > >單鏈表的逆置和從尾到頭列印單鏈表

單鏈表的逆置和從尾到頭列印單鏈表

從尾到頭列印單鏈表:遞迴法。先宣告一個節點為頭結點(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將內資料匯出到TXTTXT讀取到內

*&---------------------------------------------------------------------**& Report  ZCMH0010*&*&--------------------------------------------

稀疏矩陣的訪問、普通快速、還原輸出以及加法

  首先稀疏矩陣的概念:   在一個矩陣中(並不要求為方陣)無效元素的個數遠遠大於有效元素的個數,我們稱之為——稀疏矩陣。一般沒有一個明確的界限分開稀疏矩陣和普通矩陣,不過一些人認為:有效元素的個數/無效元素的個數<0.05即可稱之為稀疏矩陣。   跟

【劍指Offer】到頭列印連結串列(連結串列的序輸出)

目錄 題目描述 題目描述 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 解法一:使用棧 單向連結串列的逆序輸出,我們可以很容易的想到使用一個棧作為輔助,棧的先進後出的特效能幫到我們大忙。(所以基礎的資料結構是真的很重要)

前端常見演算法面試題之 - 到頭列印連結串列[JavaScript解法]

前端常見演算法面試題之 - 從尾到頭列印連結串列[JavaScript解法] 題目描述 實現思路 程式碼實現 題目描述 輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值 實現思路 前端工程師看到這個題目,直接想到的就是