一、问题描述:
腾讯面试题:单链表的反转(还是用原来的节点,实现单链表的反转操作)
为了方便理解双指针下面是我做的动画,大家可以看一下
二、解决方案
1. 遍历各项后在头部插入
1. 先定义一个节点newHead = new HeroNode();
2. 从头到尾遍历原来的链表,每遍历一个节点,就将其取出,放在新的链表newHead的头部(前面)
3. 最后原来的链表head.next = newHead.next;
代码如下:
public static void reverse(HeroNode head){
if(head.next == null || head.next.next == null){//当前链表为空,或者只有一个节点,就无需反转,直接返回
return;
}
HeroNode newHead = new HeroNode(0 , "" , "");//新的头结点
HeroNode p = head.next;
HeroNode next = null; //保存当前节点的下一个节点(防止丢失)
while(true){
if(p == null){
break;
}
next = p.next; //先将下个节点地址保存(防止丢失)
p.next = newHead.next; //在头部加入新链表
newHead.next = p;
p = next;
}
head.next = newHead.next;
}
2. 双指针
1. 定义两个指针quick(指向第一个数据) 和 slow(指向null);
2. 利用temp保存quick.next域,然后令quick.next = slow;
3. 移动两个指针:slow = quick;
quick = temp;
4. 重复上述过程,到quick = null
5. 令head.next = slow即可
如下图所示:
代码如下:
public static void reverseList(HeroNode head){
if(head.next == null || head.next.next == null){
return;
}
HeroNode quick = head.next; //快指针
HeroNode slow = null; //慢指针
while(quick != null){ //快指针不为空(没有结束)
HeroNode temp = quick.next; //保存快指针下个节点域
quick.next = slow; //逆置
slow = quick; //移动指针
quick = temp; //移动指针(取出来保存的)
}
head.next = slow;//头结点指向slow即可
}