package java_jianzhioffer_algorithm;
/**
* 题目:输入一个链表,反转链表后,输出新链表的表头。
* @author hexiaoli
* 思路:1)准备要输出这个节点时就输出这个节点的下一个节点,用递归的方式,但是实质没有实现链表反转
* 2)设置两个指针,前指针,后指针
*/
class ListNoderl {
int val;
ListNoderl next = null;
ListNoderl(int val) {
this.val = val;
}
}
public class ReverseList {
public static ListNoderl ReverseList(ListNoderl head) {
if (head == null) {
return null;
}
ListNoderl newHead = null, pNode = head, pPre = null;
while (pNode != null) {
ListNode pNext = pNode.next;
if (pNext == null) {
newHead = pNode;
}
// 替换结点的下一个结点为前结点
pNode.next = pPre;
// 向后遍历
pPre = pNode;
pNode = pNext;
}
return newHead;
}
public static ListNoderl ReverseList2(ListNoderl head) {
//head为当前节点,如果当前节点为空的话,那就什么也不做,直接返回null;
if(head == null) {
return null;
}
//三个指针,给定初始位置
//当前节点是head,preNode为当前节点的前一节点,nexNode为当前节点的下一节点
//需要preNode和next的目的是让当前节点从preNode->head->next1->next2
//变成preNode<-curNode next1->next2
//即preNode让节点可以反转所指方向,但反转之后如果不用nexNode节点保存next1节点的话,此单链表就此断开了
//所以需要用到preNode和next两个节点
//1->2->3->4->5
//1<-2<-3 4->5
ListNoderl preNode = null;
ListNoderl nexNode = null;
//做循环,如果当前节点不为空的话,始终执行此循环,此循环的目的就是让当前节点从指向next到指向pre
//如此就可以做到反转链表的效果
//先用nexNode保存head的下一个节点的信息,保证单链表不会因为失去head节点的原next节点而就此断裂
while(head !=null) {
//保存完next,就可以让head从指向next变成指向pre了,代码如下
nexNode = head.next;
//head指向preNode后,就继续依次反转下一个节点
head.next = preNode;
//让preNode,head,next依次向后移动一个节点,继续下一次的指针反转
preNode = head;
head = nexNode;
}
System.out.println(preNode.val);
return preNode;
}
public static void main(String[] args) {
ListNoderl head = new ListNoderl(5);
ListNoderl temp1 = new ListNoderl(4);
ListNoderl temp2 = new ListNoderl(1);
ListNoderl tail = new ListNoderl(3);
head.next = temp1;
temp1.next = temp2;
temp2.next= tail ;
// ReverseList1(head);
ReverseList2(head);
}
}