/***实现单链表就地反转的两种方式(递归和非递归)*leetcode#206*/publicclassReverse{classNode{intvalue;下一个节点;节点(intx){值=x;}}//非递归,双指针,head插值publicNodereverse1(Nodehead){if(head==null||head.next==null){returnhead;}//p存放第一个元素,r用于当p与后面的链表断开连接时临时存放后面的元素Nodep=head.next,r;//头节点断开head.next=null;while(p!=null){//r暂存后面的元素,因为后面要断开p的连接r=p.next;//p与后面断开连接,指向头节点后面的元素p.next=head.next;//头节点连接p,p插入头节点Head.next=p;//往后移动一个,继续反转p=r;返回头;}publicNodereverse2(Nodehead){if(head==null||head.next==null){returnhead;}//递归到链表的末尾,到上面的递归出口直接通过returnhead拿到最后一个元素//然后回到倒数第二层执行最后三行代码,得到中的反转元素turn//可以根据下图帮助理解NodenewHead=reverse2(head.next);head.next.next=头;head.next=null;返回新头;}}
