java不用api实现单链表反转(二)

这篇博客主要讲述反转链表相关思路。两种方法:时间复杂度均为O(n),空间复杂度均为O(1)


方法一:头插法

头插法不仅可以创建单链表,还可以利用其思路反转链表。首先把头节点拆下,剩下的节点依次遍历,采用头插法,相当于从新建立链表。

package singleLinklistReverse;

import singleLinklistReverse.Creat.Lnode;

public  class Reverse {
    Lnode p;
    Lnode r;
    public void reverseLinklist(Lnode first) {
        // TODO Auto-generated method stub
        p=first.next;
        while(p!=null){
            System.out.println(p.data);
            p=p.next;
        }
        p=first.next;
        first.next=null;
        while(p!=null){
            r=p.next;
            p.next=first.next;
            first.next=p;
            p=r;
        }
        p=first.next;
        while(p!=null){
            System.out.println(p.data);
            p=p.next;
        }
    }
}
结果:
12345
5
4
3
2
1
1
2
3
4
5
输入12345,采用头插法建立单链表,54321是当前链表里的数据;12345是反转之后的数据。

方法二:正常思维

该方法就是遍历到某个节点时,将其指向先前的节点,不断遍历知道其为空。要注意的是除头节点外第一个节点指针为空(变为最后一个节点了嘛),要先处理它。然后遍历完毕后要将头节点指针指向最后一个节点。(需要三个指针)

/**
 * 
 */
/**
 * @author Administrator
 *
 */
package singleLinklistReverse_2;

import singleLinklistReverse_2.Creat.Lnode;

public class Reverse_2{
    Lnode p,pre,r;
    public void reverseLinklist(Lnode first) {
        // TODO Auto-generated method stub
         p=first.next;
        while(p!=null){
            System.out.println(p.data);
            p=p.next;
        }
        p=first.next;//处理第一个节点
        r=p.next;
        p.next=null;
        pre=first.next;
        while(r!=null){
            p=r;
            r=r.next;
            p.next=pre;
            pre=p;
        }
        first.next=p;
        p=first.next;
        while(p!=null){
        System.out.println(p.data);
        p=p.next;
        }
    }

}
结果:
12345
1
2
3
4
5
5
4
3
2
1
输入12345,采用尾插法建立单链表,当前链表里数据为12345,反转后数据为54321

完整代码单击此处

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值