反转链表(Java实现)

反转链表是最基础的数据结构练习题,主要是注意一下边界处理和指针方向,下面提供了两种常用思路。假定节点结构为:

static class node{

     Object value;

     node next;

     node(Object o){

        this.value = o;

     }

}

头结点也已经声明好了:

static node head;

思路1:头插法。

public static void reserve1() {

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

           return;

     node p = head.next,newHead = new node(head.value),tmp;

     while(p!=null) {

           tmp = new node(p.value);

           tmp.next = newHead;

           newHead = tmp;

           p = p.next;

     }

     head = newHead;

}

头插法的时间复杂度和空间复杂度均为On)。

思路2:逆转指针。

public static void reserve2() {

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

           return;

     node p = head,p1 = p.next,p2 = p1.next;

     while(p2!=null) {

           p1.next = p;

           p = p1;

           p1 = p2;

           p2 = p2.next;

     }

     p1.next = p;

     head.next = null;

     head = p1;

}

这里需要注意将之前的头结点的指针置为null,否则最后会形成一个环。逆转指针的方法空间复杂度仅为O(1)。


如果你有更好的思路欢迎在评论区留言,欢迎点赞转发,感谢阅读。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值