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