这篇文章讲述的是数据结构部分的线性表的逆置的java实现,如有错误或者不当之处,还望各位大神批评指正。
问题描述
请编写一个算法实现链表的逆置,如有初始链表L:1,2,3,4,5逆置后为L:5,4,3,2,1
算法分析
- 通过头插法可以实现对链表的逆置,顺序访问每个节点并把节点插入表头。
- O(n),空间复杂度O(1)
代码实现
- 注:链表的实现请移步https://blog.csdn.net/u013634252/article/details/81230114,这里不再赘述
- 核心代码
/**
* @explain reverse方法: 将链表逆转
* @throws
* @author 叶清逸
* @date 2018年7月27日 下午12:42:44
*/
public void reverse(){
/*初始化遍历的指针*/
Element p = head.next ;
/*先将头结点与元素节点断开*/
head.next = null ;
/*遍历整个链表使用头插法将遍历的每个元素都插到头结点的后边*/
for(int i=0 ; i<LENGTH ; i++){
/*新建一个指针q指向当前节点后p指针下移*/
Element q = p ;
p = p.next ;
/*将当前节点插入头结点后*/
q.next = head.next ;
head.next = q ;
}
}
- 例子
/**
* 问题描述:请编写一个算法实现链表的逆置,如有初始链表L:1,2,3,4,5逆置后为L:5,4,3,2,1
*
* 算法分析:通过头插法可以实现对链表的逆置,顺序访问每个节点并把节点插入表头。
*
* 复杂度分析:时间复杂度:O(n),空间复杂度O(1)
*/
public static void main(String[] args) {
LinkList3 L = new LinkList3() ;
L.init();
for(int i=1 ; i<=100 ; i++){
L.put(i);
}
System.out.println(L);
long t1 = System.currentTimeMillis() ;
L.reverse();
long t2 = System.currentTimeMillis() ;
System.out.println(L);
System.out.println("转换操作共耗时:"+(t2-t1)+"毫秒");
}
样例输出
LinkList:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]
LinkList:[100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
转换操作共耗时:0毫秒