现在算法是大厂面试的必考题,而且越来越难,已经不是简单的列表,字符串操作了,会涉及到各种数据结结构。单链表的反转也是经常考的一道题,里面故在此记录一下。
1.链表的特点:
顺序存储元素,但是元素在空间上是不连续的,所以在链表每个元素中除了存储元素的值,还会存储下一个元素的地址,单链表的话就只有指向下一个元素的指针,双向链表的话还会有指向前一个元素的指针。正是由于链表以上的存储特点,在做插入和删除操作时只需要断开指针的连接,不需要移动后面的数据,所以对链表修改的效率会很高,但是查找的效率会很低,这也正是链表和数组的区别。链表的存储示意图:
完成这道题至少有3种方式:
- 先对原链表做头部删操作,再对新链表做头部插入操作;
- 通过3个指针实现,p0指向前一个节点的指针,p1表示当前节点的指针,p2表示下一个节点的指针
- 用递归实现;
2.方式一:
1)创建一个新的空列表;
2)取出旧链表中头结点的元素,将其next指针设置为新链表的头指针,同时将旧链表的头结点执行下一个元素
3)依次重复第2)步的操作,直到取出就链表中所有的节点。
4)最后形成的新链表如下,实现了反转的功能:
5)代码实现: