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

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

2016-02-27 19:11 393 查看
这篇博客主要讲述反转链表相关思路。两种方法:时间复杂度均为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


完整代码单击此处
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: