JavaExample09-单向链表的倒置
2021/6/26 1:26:54
本文主要是介绍JavaExample09-单向链表的倒置,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
JavaExample09-单向链表的倒置
1.原理
将单向链表倒置的难点是单向链表的每个节点只能指向一个节点,如果直接将链表中某一个节点指向其前一个节点,那么就找不到后面的节点了。
所以我们需要定义指针来进行操作。
定义三个指针curNode、preNode、nextNode,分别代表当前节点,当前节点的前一个节点,当前节点的后一个节点。
- 先将nextNode移动至当前节点的后一个节点位置
- 然后将当前节点指向前一个节点preNode位置
- 然后将preNode移动至当前节点位置
- 然后将curNode移动至后一个节点位置
如此循环操作,直至遍历完整个链表。
最后,让倒置前的尾节点成为新的头结点。
图示:
1.定义三个指针
2.nextNode指针移动至curNode后一个节点
3.curNode指针所代表节点指向前一个节点preNode
4.preNode指针指向curNode所代表的当前节点
5.curNode指针移动至下一个节点位置
6.nextNode指针继续移动至后一个节点位置
7.curNode所代表的节点指向前一个节点
8.preNode指针指向至当前节点
9.curNode指针移动至后一个节点
如此循环,直至遍历整个链表
2.代码实现
public void inversion() { //定义三个指针,分别指向当前节点,当前节点前一个节点,当前节点的后一个节点 Node curNode = head; Node preNode = null; Node nextNode = null; while (curNode != null) { //将nextNode移动至当前节点的下一个节点位置 nextNode = curNode.getNext(); //然后将当前节点指向前一个节点preNode位置 curNode.setNext(preNode); //然后将preNode移动至当前节点位置 preNode = curNode; //然后将curNode移动至后一个节点位置 curNode = nextNode; } //遍历完链表后使先前的尾节点成为新的头结点 head = preNode; }
3.完整代码
3.1节点类
/** * @Author: TSCCG * @Date: 2021/06/25 22:26 */ public class Node{ private Integer data; private Node next; public Node(Integer data) { this.data = data; } public Integer getData() { return data; } public void setData(int data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }
3.2链表类
/** * @Author: TSCCG * @Date: 2021/06/25 22:29 */ public class InversionLinkedList { private Node head; private int size = 0; /** * 添加节点 * @param data 节点中的数据 */ public void add(Integer data) { Node newNode = new Node(data); if (head == null) { head = newNode; } else { getEnd(head).setNext(newNode); } size++; } /** * 找到尾节点 * @param node 从该节点开始找 * @return 返回尾节点 */ private Node getEnd(Node node) { if (node.getNext() == null) { return node; } return getEnd(node.getNext()); } /** * 遍历节点 */ public void printNode() { Node tempNode = head; while (tempNode != null) { if (tempNode.getNext() == null) { System.out.println(tempNode.getData()); } else { System.out.print(tempNode.getData() + ","); } tempNode = tempNode.getNext(); } } /** * 链表倒置 */ public void inversion() { //定义三个指针,分别指向当前节点,当前节点前一个节点,当前节点的后一个节点 Node curNode = head; Node preNode = null; Node nextNode = null; while (curNode != null) { //将nextNode移动至当前节点的下一个节点位置 nextNode = curNode.getNext(); //然后将当前节点指向前一个节点preNode位置 curNode.setNext(preNode); //然后将preNode移动至当前节点位置 preNode = curNode; //然后将curNode移动至后一个节点位置 curNode = nextNode; } //遍历完链表后使先前的尾节点成为新的头结点 head = preNode; } }
3.3测试类
/** * @Author: TSCCG * @Date: 2021/06/25 22:56 */ public class InversionTest { public static void main(String[] args) { InversionLinkedList list = new InversionLinkedList(); list.add(1); list.add(2); list.add(3); list.add(4); System.out.println("-------倒置前-------"); list.printNode(); System.out.println("-------倒置后-------"); list.inversion(); list.printNode(); } }
结果:
-------倒置前------- 1,2,3,4 -------倒置后------- 4,3,2,1
这篇关于JavaExample09-单向链表的倒置的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)