java linked reverse_反转链表(Reverse Linked List)

反转一个单链表。如下示例::

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

public class ListNode {

int val;

ListNode next;

ListNode(int x) {

val = x;

}

}

一、 迭代法:

注意观察示例:1->2->3->4->5->NULL的反转可以看成:NULL

会发现链表的反转基本上就是箭头的方向的反转,即节点前驱和后继互换角色。

我们定义三个变量cur,pre和next分别表示当前节点,以及其前驱后继。cur初始化为head,其他初始化为NULL。

我们从头节点1开始遍历,1的next和pre原来分别是2和NULL(初始值)互换后1的next和pre变成NULL和2,依次这样遍历下去。

注意最后应该返回pre,不是cur。遍历结束后cur的值是NULL。

代码如下:

public ListNode reverseList(ListNode head){

ListNode pre = null, cur = head, next = null;

while(cur != null){

next = cur.next;

cur.next = pre;

pre = cur;

cur = next;

}

return pre;

}

二、递归法:

递归法和迭代法思路是一样的。

代码如下:

public ListNode reverseList(ListNode head){

if(head == null || head.next == null){

return head;

}

ListNode n = reverseList(head.next);

head.next.next = head;

head.next = null;

return n;

}

只是注意两个地方:

如果head是空或者遍历到最后节点的时候,应该返回head。

代码5,6行。节点替换的时候不要用n来代替head->next;因为对于递归来说它们不是等价的。但是head->next->next 等价于 n->next。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值