电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java 利用棧來反轉鏈表和排序的操作

瀏覽:5日期:2022-08-17 10:36:46

棧是一個特殊的數據結構,特點是先進后出(First In Last Out 簡稱FILO),這種特殊的數據結構,可以用在對鏈表做反轉中,或者字符串逆序,因為要把頭變成尾,尾變成頭,棧這種結構最合適不過了,下面來看看如何用棧來做鏈表的反轉。

package com.xxx.algorithm.sort;import java.util.Stack;public class LinkedListReverse { public static Node reverseLinkedList(Node head){ Stack<Node> stack = new Stack<Node>(); while(head!=null){ stack.push(head); head = head.next; } if(!stack.isEmpty()) head = stack.pop(); Node cur = head; while(!stack.isEmpty()){ Node node = stack.pop(); node.next = null; cur.next = node; cur = node; } return head; } public static void display(Node head){ System.out.print('list:'); Node cur = head; while(cur!=null){ System.out.print(cur+'->'); cur = cur.next; } System.out.println(); } public static void main(String[] args) { Node a = new Node('a'); Node b = new Node('b'); Node c = new Node('c'); Node d = new Node('d'); Node e = new Node('e'); Node f = new Node('f'); Node g = new Node('g'); a.next = b; b.next = c; c.next = d; d.next = e; e.next = f; f.next = g; System.out.println('原始鏈表:'); display(a); Node head = reverseLinkedList(a); System.out.println('反轉之后的鏈表:'); display(head); }} class Node{ String val; Node next; public Node(String val) { this.val = val; } @Override public String toString() { return 'Node('+this.val+')'; }}運行程序,結果如下:

原始鏈表:

list:Node(a)->Node(b)->Node(c)->Node(d)->Node(e)->Node(f)->Node(g)->

反轉之后的鏈表:

list:Node(g)->Node(f)->Node(e)->Node(d)->Node(c)->Node(b)->Node(a)->

通過棧來反轉鏈表思路很簡單,這只是說了棧作為一種數據結構,其實用途很廣泛。今天要介紹的另外一個棧的用途是如何通過棧來排序,利用棧來排序,需要有兩個棧,一個存放原始數據,一個是輔助排序用的。

具體思路就是:將棧中的數據依次放入輔助棧中,放入輔助棧的要求是按照數據從大到小的排列(或者從小到大),先進入的是較大的數,后進入的是較小的數,如果原棧中沒有數據了,說明數據已經在輔助棧中排好序了,接著我們把數據再一次性放入原棧中,如果遍歷,就是一個排好序的數組了。

這里面把原棧中的數據放入輔助棧中,需要借助一個中間變量,原棧中彈出的數據放入中間變量中,而不是直接入輔助棧,如果棧頂的元素小于中間變量,那么將小于的數據再放入原棧中,再將中間變量放入輔助棧,接著再將原棧中的數據放入輔助棧,直到原棧為空。將中間變量放入輔助棧,類似插入排序,需要找到一個合適的位置,而移動出一個合適的位置,就是把輔助棧中的數據再次壓入原棧中。

算法示例代碼如下:

package com.xxx.algorithm.sort;import java.util.Iterator;import java.util.Stack;public class StackSortDemo { public static void sortByStack(Stack<Integer> stack){ Stack<Integer> help = new Stack<Integer>(); while(!stack.isEmpty()){ int cur = stack.pop(); while(!help.isEmpty()&&help.peek()<cur){ stack.push(help.pop()); } help.push(cur); } while(!help.isEmpty()){ stack.push(help.pop()); } } public static void display(Stack<Integer> stack){ System.out.print('stack:'); Iterator<Integer> it = stack.iterator(); while(it.hasNext()){ System.out.print(it.next()+'->'); } System.out.print('null'); System.out.println(); } public static void main(String[] args) { Stack<Integer> stack = new Stack<Integer>(); stack.push(2); stack.push(9); stack.push(5); stack.push(4); stack.push(6); stack.push(3); stack.push(8); stack.push(7); System.out.println('原始棧:'); display(stack); sortByStack(stack); System.out.println('排序之后的棧:'); display(stack); }}運行程序,打印信息如下:

原始棧:

stack:2->9->5->4->6->3->8->7->null

排序之后的棧:

stack:2->3->4->5->6->7->8->9->null

補充:Java數據結構與算法-------鏈表反轉(如何實現鏈表的逆序)

1. 問題:

鏈表 head -->1-->2-->3-->4-->5-->6-->7, 如何反轉為head -->7-->6->5-->4-->3-->2-->1,

2.思路(使用插入法)

思路:從鏈表的第二個節點開始,把遍歷到的節點插入到頭結點的后面,直到遍歷結束。

假設原鏈表:head -->1-->2-->3-->4-->5-->6-->7,

在遍歷2的時候,鏈表變為head -->2-->1-->3-->4-->5-->6-->7,

3.代碼實現:

package LinkedList.Reverse;/* 這里使用插入法進行反轉鏈表 思路:從鏈表的第二個節點開始,把遍歷到的節點插入到頭結點的后面,直到遍歷結束。 假設原鏈表:head -->1-->2-->3-->4-->5-->6-->7, 在遍歷2的時候,鏈表變為head -->2-->1-->3-->4-->5-->6-->7, */public class Reverse { public static void main(String[] args) { //定義頭結點 LNode head=new LNode(); head.next=null; LNode temp=null; LNode cur=head; //構造鏈表 for (int i = 1; i < 8; i++) { temp=new LNode(); //定義一個輔助節點 temp.data=i; //temp數據為I temp.next=null; cur.next=temp; //頭結點的下一個節點為temp cur=temp; //cur后移 由head移動到temp } System.out.println('逆序前:'); for (cur=head.next;cur!=null;cur=cur.next){ System.out.println(cur.data+' '); } System.out.println('逆序后:'); Reverse(head); for (cur=head.next;cur!=null;cur=cur.next){ System.out.println(cur.data+' '); } } public static void Reverse(LNode head){ if (head==null || head.next==null){//如果頭結點為空,或者頭結點的下一個節點為空,鏈表不用反轉 return; } LNode cur=null;//定義一個當前節點 LNode next=null;//定義一個后繼節點 //讓當前節點指向第二個節點 cur=head.next.next; //先把第一個節點設置成最后一個節點 head.next.next=null; while (cur!=null){//如果當前節點不為空 next=cur.next;//先保存當前節點的后繼節點 如 2 的后面一個節點3 先保存起來 cur.next=head.next;// 就是把2 的下一個節點指向1 head.next=cur;//把頭結點指向2 cur=next; //將當前節點指向下一個 3 } }} class LNode{ LNode next; int data;}使用遞歸法

//使用遞歸法 private static LNode RecursiveReverse(LNode head){ //如果鏈表為空或者鏈表只有一個元素 if (head==null || head.next==null){ return head; }else { //反轉后面的節點 LNode newHead = RecursiveReverse(head.next); //把前面遍歷的節點加到后面節點逆序后鏈表的尾部 head.next.next=head; head.next=null; return newHead; } } public static void Reverse(LNode head){ if (head==null){ return; } //獲取鏈表的第一個節點 LNode firstNode=head.next; //對鏈表進行逆序 LNode newhead = RecursiveReverse(firstNode); head.next=newhead; }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Java
相關文章:
主站蜘蛛池模板: 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 传爱自考网_传爱自学考试网 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 水上浮桥-游艇码头-浮动码头-游船码头-码瑞纳游艇码头工程 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 阜阳成人高考_阜阳成考报名时间_安徽省成人高考网 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 楼梯定制_楼梯设计施工厂家_楼梯扶手安装制作-北京凌步楼梯 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 防锈油-助焊剂-光学玻璃清洗剂-贝塔防锈油生产厂家 | 建筑工程资质合作-工程资质加盟分公司-建筑资质加盟 | 连续油炸机,全自动油炸机,花生米油炸机-烟台茂源食品机械制造有限公司 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 无痕胶_可移胶_无痕双面胶带_可移无痕胶厂家-东莞凯峰 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 建大仁科-温湿度变送器|温湿度传感器|温湿度记录仪_厂家_价格-山东仁科 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 | 温州富欧金属封头-不锈钢封头厂家| 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | UV-1800紫外光度计-紫外可见光度计厂家-翱艺仪器(上海)有限公司 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 上海办公室装修,写字楼装修—启鸣装饰设计工程有限公司 | 网站优化公司_SEO优化_北京关键词百度快速排名-智恒博网络 | 有声小说,听书,听小说资源库-听世界网| 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 汽车水泵_汽车水泵厂家-瑞安市骏迪汽车配件有限公司 | 大型果蔬切片机-水果冬瓜削皮机-洗菜机切菜机-肇庆市凤翔餐饮设备有限公司 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 滚塑PE壳体-PE塑料浮球-警示PE浮筒-宁波君益塑业有限公司 |