当然这个算不上是困难的算法,面试考的也不少,实现起来可以有多种方法,但是你能写出最优秀的吗?
大概有这几种:
reverse1.新建一个单链表把原链表的内容逐个头插法插入新链表中.从而实现了链表的翻转.
reverse2.新建一个数组把原链表的内容copy到数组和新链表中.从而实现了链表的翻转.
reverse3.一次遍历单链表,原地将原链表翻转
评注:
reverse1 在实现的时候,也只是遍历了一次原链表,但是却要新创建一个链表,来保存原链表的反转内容,相当于原链表的副本.虽然时间复杂度上为O(n),但却浪费了空间,而且还有链表的头插入,带来指针的移动额外的开支.
reverse2与reverse1 一样在时间复杂度上为O(n),但是翻转的内容是用Node数组保存,这样失去了链表的实质,再者,链表的长度本应是不固定的.所以要适应不同的链表,数组的长度使不能确定的.因此,要使用此方法需要明确知道单链表的长度.否则,在做反序输出数组时,可能造成数组下标越界.
reverse3与前两者相比,也是遍历一次原链表.但是它在遍历的同时改变了原链表的指针方向,是原链表的节点改变成指向原来相反的地方.这样做就达到了翻转的目的.而且时间复杂度依然是O(n).且不需要另外开辟新的空间来存放新的链表.这样做的好处在不改变原链表节点存放数据内容外,而且没有对数据的操作,只是对指针的操作.避免了改写原链表存放的数据.