java经典面试题:单链表反转问题,有两种方法,一种为循环遍历法,一种递归法。
1、循环遍历法
首先设置三个节点,把当前节点的下一节点指向它前面的节点,此时你会发现指针链会断,所以要先把它后面一个节点用nextNode保存下来,之后把节点向后移动遍历即可。
代码如下:
//定义单链表节点类
public class ListNode {
int value;
ListNode next;
public ListNode() {
this.value=0;
this.next=null;
}
public ListNode(int value) {
this.value=value;
}
}
//定义链表反转方法
public ListNode reverseList(ListNode root) {
if(root==null)return root;
ListNode newhead=null; //反转后的新链表头结点
ListNode preNode = null; //前一节点
ListNode nextNode=null; //下一节点
ListNode curNode=root; //当前节点
while(curNode.next!=null) {
nextNode=curNode.next; //保存当前节点的下一节点
curNode.next=preNode; //使当前节点指向前一节点
preNode=curNode; //把前一节点往后移
curNode=nextNode; //把当前节点往后移
}
newhead=curNode;
return newhead;
}
2、递归法
如果当前节点或者当前节点的下一节点为空,直接返回该节点;
否则使该节点的后一节点指向该节点,以此递归。
public BinaryNode reverseList2(BinaryNode root) {
if(root==null||root.next==null)return root;
BinaryNode nextNode=root.next; //得到当前节点的下一节点
root.next=null; //打断当前指针链
BinaryNode re=reverseList2(nextNode); //每次递归下一节点进行反转
nextNode.next=root; //反转指针域
return re;
}