单链表的反转
来源:互联网 发布:c语言循环从1加到100 编辑:程序博客网 时间:2024/06/05 02:00
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点
分析:
1.递归反转法
在反转当前节点之前先反转后续节点。这样从头结点开始,层层深入直到尾结点才开始反转指针域的指向。简单的说就是从尾结点开始,逆向反转各个结点的指针域指向,递归反转发是使用的比较普遍的方法也是容易想到的方法
代码实现:
链表类
public class ReserveLinkedList {static class ListNode{int value;ListNode next;public int getValue() {return value;}public void setValue(int value) {this.value = value;}public ListNode getNext() {return next;}public void setNext(ListNode next) {this.next = next;}public ListNode(int value,ListNode next) {this.value = value;this.next= next;}}/** * 递归反转的思想其实很简单,从头结点开始,层层深入直到尾结点才开始反转指针域的指向。 * 简单的说就是从尾结点开始,逆向反转各个结点的指针域指向 * @param head * @return */public static ListNode reservedHead(ListNode head) {//为了理解方便,我们这里把head看做前一结点,head.getnext()看成当前结点if(head == null || head.getNext() == null) {return head;}//递归反转ListNode reHead = reservedHead(head.getNext());//当前链表的下一节点指向前一结点head.getNext().setNext(head);//前一结点的下一个结点设为空head.setNext(null);return reHead;}public static void main(String[] args) {//测试方法和反转后的输出可以自行完成}}
2.遍历反转法
遍历反转法的思想就是从前往后一次转换的各个结点的指针指向,具体做法就是:将当前节点cur的下一个节点 cur.getNext()缓存到temp后,然后更改当前节点指针指向上一结点pre。也就是说在反转当前结点指针指向前,先把当前结点的指针域用tmp临时保存,以便下一次使用
代码实现:
/** * 遍历反转 * @param head * @return 反转后链表的头结点 */public static ListNode reservedHead2(ListNode head) {if(head == null) {return head;}ListNode pre = head;ListNode cur = head.getNext();//临时节点,用来保存当前结点的下一结点ListNode temp = null;while(cur != null) {//如果当前结点为null,说明位于尾结点temp = cur.getNext();if(temp == null){ return cur; }cur.setNext(pre);//反转操作//指针往后移动pre = cur;cur = temp;}//反转完成后,讲原链表的头结点head的指针域指向nullhead.setNext(null);return pre;}
阅读全文
1 0
- 单链表的反转
- 单链表的反转
- 单链表的反转
- 单链表的反转
- 单链表的反转
- 单链表的反转 c++
- 单链表的反转
- 单链表的反转
- 单链表的反转问题
- 单链表的反转实现
- 2、单链表的反转
- 单链表的反转
- 单链表的反转
- 单链表的反转
- 单链表的反转
- 单链表反转的实现
- 单链表的反转
- 单链表的反转
- 【lintcode】最大子数组
- vim的基本设置环境
- 72. Edit Distance
- 从零开始搭建MVC项目
- linux上iostat命令
- 单链表的反转
- 极大似然估计
- keil快捷键 设定
- WEB免费打印控件推荐
- C三道题(五)
- 独家 | 一文读懂LinkedIn个性化推荐模型及建模原理
- 线程并发学习—-ConcurrentHashMap
- 工作总结
- lucene搜索原理讲解