您的位置:首页 > 编程语言 > Java开发

【算法】Java单链表逆转

2016-10-06 13:25 309 查看
单链表逆转置的递归与非递归方式

Node类

public class ListNode {
int val;
ListNode next;

ListNode(int x) {
val = x;
}
}


先看递归求解:

public ListNode reverse1(ListNode head) {
// 当为空或者本节点为末尾节点的时候
if (head == null || head.next == null)
return head;
ListNode temp = head.next;
ListNode reversedHead = reverse1(head.next);
// 获取先前的下一个节点,让该节点指向自身
temp.next = head;
// 破坏以前自己指向下一个节点
head.next = null;
// 层层传递给最上面的
return reversedHead;
}


有点难理解,看看debug的图基本上就能懂了。



就是在temp存储了尾节点,然后再一层层往前。这个head.next=null是必须的,因为最后一个节点时不会自己赋值的,会形成一个环。

非递归算法:

public ListNode reverse(ListNode head){
ListNode p = head,q = null,front = null;
while(p!=null){
q = p.next;//设置q是p结点的后继结点,即用q来保持p的后继结点
p.next = front;//逆转,即使p.next指向p结点的前驱结点
front = p;//front向后移一步
p = q;//p向后移一步
}
head = front;//head指向原链表的最后一个结点,完成逆转
return head;
}


这个理解起来就比较简单啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐