链表反转 (LeetCode206
思路:
方法一: 定义一个虚拟节点
遍历链表,将链表的元素一个个往虚拟节点的head->next 插入
代码实现:
public static Node linkedListReverse(Node node ){
//创建虚拟节点
Node node1 = new Node(-1); //-1 null
Node cur = node; // 1 2 3 4
while (cur!=null){
//获取原链表的的next
Node next = cur.next; //2 3 4 3 4
//获取原链表的头节点指向虚拟节点的next
cur.next = node1.next; //1 null 2
//虚拟节点的next指向拼接的好的链表
node1.next = cur;//-1 1
cur = next; //2 3 4
}
return node1.next;
}
方法二: 直接操作链表实现反转
代码实现:
//直接操作数组实现
public static Node reverseList(Node node ){
Node pre = null;
Node cur = node;
while (cur!=null){
Node next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
两种方法其实没有太大差别,只是new不new对象的问题。
方法三: 采用递归来实现
代码实现:
//递归实现
public static Node recurtionList(Node node ){
if(node ==null || node.next==null){
return node;
}
Node newNode = recurtionList(node.next);
node.next.next = node;
node.next = null;
return newNode;
}