单链表的反转

来源:互联网 发布: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;}




原创粉丝点击