最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java反轉鏈表的多種解決方法舉例詳解

 更新時間:2025年04月22日 09:25:43   作者:DIO?KING  
這篇文章主要介紹了java反轉鏈表的多種解決方法,分別是使用棧、雙指針和遞歸,每種方法都有其實現(xiàn)原理和代碼示例,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

反轉鏈表的三種方式

1,使用棧解決

棧是最容易的一種方式了,因為棧是先進后出。實現(xiàn)原理就是把鏈表節(jié)點一個個入棧,全部入棧之后再一個個出棧,出棧的時候在把節(jié)點按照出棧的順序組成一個新的鏈表。

原理如圖:

代碼如下:

public ListNode ReverseList(ListNode head){
	Stack<ListNode> stack = new Stack<>();
	//把全部節(jié)點都壓入棧中
	while(head != null){
		stack.push(head);
		head = head.next;
	}
	//如果stack棧里面沒有數(shù)據(jù),說明head是一個空指針,因此可以直接返回
	//不需要進行后續(xù)計算
	if(stack.isEmpty()){
		return null;
	}
	ListNode node = stack.pop();//出棧的第一個節(jié)點成為第一個新鏈表的第一個節(jié)點
	ListNode dummy = node; //保留頭節(jié)點,用于最后的返回
	//把棧中的節(jié)點全部出棧,然后重新連成一個新的鏈表
	while(!stack.isEmpty()){
		node.next = stack.pop();
		node = node.next;//更換鏈表的最后一個元素
	}
	//最后一個節(jié)點就是反轉前的頭節(jié)點,需要讓他的next為null
	//不然可能構成環(huán)
	node.next = null;
	return dummy;//最后返回保存好的頭節(jié)點
}

2,雙指針實現(xiàn)

利用兩個指針來保存鏈表中數(shù)據(jù),一個指針用來存儲當前節(jié)點中next元素中更改后的值,另一個指針來指向下一個需要更改節(jié)點的地址。

原理如圖:

代碼如下:

public ListNode ReverseList(ListNode head) {
	//當前節(jié)點中next元素改變后的值
	//初始值為null是因為更改后 原第一個元素 改后最后一個元素
	//next指向的值為null
	ListNode ChangeNode = null;
	while (head != null) {
	    //先保存當前訪問的節(jié)點的下一個節(jié)點
		//留著while循環(huán)最后更新數(shù)據(jù)并且
		ListNode nextNode = head.next;
		//把當前節(jié)點中next元素進行更改,使其可以指向前一個元素
		head.next = ChangeNode;
		//更新ChangeNode指針,用于下一次節(jié)點next元素更新
		ChangeNode = head;
		//更新節(jié)點,去往下一個節(jié)點
		head = nextNode;
	}
	//循環(huán)之后ChangeNode指向的值為 原最后一個節(jié)點 改后第一個節(jié)點
	//所以返回ChangeNode就是改后的頭節(jié)點
	return ChangeNode;
}

3,遞歸實現(xiàn)        

遞歸實現(xiàn)是最難的,理由是遞歸本身很難理解。我認為遞歸的本質是通過不斷的改變參數(shù)找到問題的原點,再進行返回。邏輯處理部分則是在不斷找尋原點的過程中,或者是找到原點后在返回的過程中進行的。這個題目既可以在找原點的過程中設置邏輯處理,也可以在返還的過程中進行邏輯處理。 

找原點的過程中設置邏輯處理:

public ListNode ReverseList(ListNode head) {
    //Reverse函數(shù)的兩個參數(shù)的意思是,當前節(jié)點和上一個節(jié)點
    //head是原本函數(shù)的頭節(jié),null是更改后頭節(jié)點指向的值
    return Reverse(head, null);
}

public ListNode Reverse(ListNode nowNode, ListNode lastNode) {、
    //當前節(jié)點是null
    //說明上一個節(jié)點是最后一個節(jié)點
    if (nowNode == null) { 
        return lastNode;  
    }
    //先保存下一個地址的位置
    ListNode next = nowNode.next;
    //讓當前節(jié)點指向上一個節(jié)點
    nowNode.next = lastNode;

    //處理完這個節(jié)點的邏輯之后開始前往下一個節(jié)點
    return Reverse(next, nowNode);
}

返還的過程中進行邏輯處理:

	public ListNode ReverseList(ListNode head){
		//當前節(jié)點的next元素沒有指向下一個元素的時候說明這是最后一個元素
		if(head == null || head.next == null){
			return head;
		}
		//找到最后一個元素,并開始一層一層的往上傳遞
		ListNode last = ReverseList(head.next);
		//把下一個元素指向的元素改為自己
		//(因為遞歸條件的影響當前的元素只可能是反轉后第二個元素之后的元素,
		// 所以head.next.next不會越界)
		head.next.next = head;
		//并且清除當前指向的節(jié)點,防止可能的問題(成環(huán))
		head.next = null;
        //傳遞最后一個元素
		return last;
	}

建議先看懂前面兩個方法再來看最后的遞歸,先看懂這個題目的基本處理邏輯。

后面兩個解法的本質是指針的運用,Java對這方面沒有很好的解釋,所以可能會有點難理解

總結

到此這篇關于java反轉鏈表的多種解決方法的文章就介紹到這了,更多相關java反轉鏈表解決方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mac配置idea maven全過程

    mac配置idea maven全過程

    本文主要介紹了在Mac上配置IDEA和Maven的過程,包括下載Maven、編輯setting.xml文件、配置Maven和IDEA的相關路徑等步驟
    2026-04-04
  • Java對象的復制三種方式(小結)

    Java對象的復制三種方式(小結)

    這篇文章主要介紹了Java對象的復制三種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Java中Map的用法詳解

    Java中Map的用法詳解

    將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多只能映射到一個值。此接口取代 Dictionary 類,后者完全是一個抽象類,而不是一個接口
    2016-05-05
  • java通過信號量實現(xiàn)限流的示例

    java通過信號量實現(xiàn)限流的示例

    本文主要介紹了java通過信號量實現(xiàn)限流的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • mybatis?foreach?list特殊處理方式

    mybatis?foreach?list特殊處理方式

    這篇文章主要介紹了mybatis?foreach?list特殊處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中你真的會用Constructor構造器嗎之看完本篇你就真的會了

    Java中你真的會用Constructor構造器嗎之看完本篇你就真的會了

    顯式初始化要求我們在寫程序時就確定初始值,這有時很不方便。我們可以使用構造器(constructor)來初始化對象。構造器可以初始化數(shù)據(jù)成員,還可以規(guī)定特定的操作。這些操作會在創(chuàng)建對象時自動執(zhí)行。下面文字將對該內容做詳細介紹,需要的小伙伴請參考
    2021-09-09
  • Java ES(Elasticsearch) 中的and 和 or 查詢

    Java ES(Elasticsearch) 中的and 和 or 查

    Elasticsearch 是一個分布式、高擴展、高實時的搜索與數(shù)據(jù)分析引擎,es中match查詢中,查詢字符串分詞后,默認是or或者的關系,這篇文章主要介紹了ES 中的and 和 or 查詢,需要的朋友可以參考下
    2022-11-11
  • Java中executeQuery()和executeUpdate()的區(qū)別及說明

    Java中executeQuery()和executeUpdate()的區(qū)別及說明

    executeQuery()和executeUpdate()是JDBC中用于執(zhí)行SQL語句的方法,前者用于執(zhí)行查詢語句,返回ResultSet對象;后者用于執(zhí)行修改操作,返回受影響的行數(shù),使用這些方法時需要注意SQL語句的正確性、資源的釋放以及防止SQL注入
    2025-11-11
  • 非常全面的IReport的使用教程

    非常全面的IReport的使用教程

    iReport 是為JasperReports Library和JasperReports Server設計的報表可視化設計器。本教程給大家詳細介紹IReport的使用解析,感興趣的朋友一起看看吧
    2021-10-10
  • Java8中日期時間API的避坑指南與最佳實踐指南

    Java8中日期時間API的避坑指南與最佳實踐指南

    在Java 8之前,處理日期時間我們常用Date、Calendar和SimpleDateFormat,本文將通過實際案例,剖析老API的典型陷阱,并展示如何使用新API優(yōu)雅避坑,希望對大家有所幫助
    2026-04-04

最新評論

平昌县| 通渭县| 彭泽县| 桦甸市| 雅安市| 屯门区| 安丘市| 叙永县| 宜良县| 准格尔旗| 芦山县| 泾阳县| 榆树市| 肇源县| 屏南县| 长沙县| 岑溪市| 贵港市| 綦江县| 醴陵市| 河南省| 望城县| 郸城县| 乐清市| 曲沃县| 永和县| 开远市| 合江县| 龙江县| 兰坪| 四子王旗| 治多县| 黄石市| 河西区| 陆川县| 彭泽县| 比如县| 贵港市| 红桥区| 龙口市| 黄大仙区|