package SwordOffer;
/**
* @Description: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
* @Param:
* @return:
* @Author: lvhong
* @Date:
* @E-mail lvhong282@163.com
*/
public class lab24easy {
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
//双指针 其实可以看做返回了一个新链表
public ListNode reverseList(ListNode head) {
ListNode pre = head;
ListNode cur = null;
ListNode temp = null;
while (pre != null) {
temp = pre.next; //暂存新链表的下一个值
pre.next = cur; //新链表的指向与原来相反
cur = pre;// cur从null(尾结点)变为头,头依次向后
pre = temp; // pre跳到暂存的后一位
}
return cur;
}
//递归1: 尾递归
// public ListNode reverseList(ListNode head) {
// return reverse(head,null); //新链表的前->后依次为入参
// }
// ListNode reverse(ListNode pre,ListNode cur){
// if(pre==null) {return cur;} //旧链表当前节点的下一个为空说明是最后一个节点,结束递归的条件
// ListNode temp=pre.next; //暂存pre之后的节点,给下一个递归
// pre.next=cur;//改变指向
// return reverse(temp,pre);
// }
//递归2 积压到最后才处理
// public ListNode reverseList(ListNode head) {
// if(head==null||head.next==null){
// return head;
// }
// ListNode cur = reverseList(head.next);
// head.next.next=head;
// head.next=null; //断开原来的前向后指向,防止循环链接
// return cur;
// }
//借用外部空间 栈
// public ListNode reverseList(ListNode head) {
// Stack<ListNode> stack = new Stack<>();
// while(head!=null){
// stack.push(head);
// head=head.next;
// }
// ListNode cur=stack.pop();
// ListNode out =cur;
// while(!stack.isEmpty()){
// ListNode temp = stack.pop();
// cur.next=temp;
// cur=cur.next;
// }
// cur.next=null;
// return out;
// }
}