题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点
分析:
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的指针域指向null
head.setNext(null);
return pre;
}