链表反转是一个出现频率特别高的算法题
比如给你个一链表:1-->2-->3-->4-->5-->null,经过反转会变成:5-->4-->3-->2-->1-->null
那么我们怎么来实现链表反转呢?
方法一:使用虚拟节点
1.我们先建立一个虚拟节点ans,它的初始值设为空,next为null。
2.创建一个当前节点cur=head。
3.cur不为空,则重复执行while循环的代码
4.开始的时候,我们先获取cur的下一个节点定义为next。然后让cur.next=ans.next;
ans.next=cur。这样第一个节点就拆下来啦
5.之后重复执行此过程,新节点放在ans的后面,在其它节点的前面。
代码如下:
public ListNode reverseList(ListNode head) {
ListNode ans=new ListNode(-1);
ListNode cur=head;
while(cur!=null){
ListNode next=cur.next;
cur.next=ans.next;
ans.next=cur;
cur=next;
}
return ans.next;
}
执行过程:
方法二:直接操作链表进行反转
1.我们需要定义一个空节点pre=null(pre就相当于新链表的头节点),一个当前节点cur=head;
2.获取cur的下一个节点定义为next
3.令cur.next=pre ,pre=cur
4.最后让cur移动到下一个节点cur=next;
这样以pre为头节点的链表就有了第一个元素,重复此过程直到旧链表全部加到新的链表中
代码如下:
public ListNode ReverseList (ListNode head) {
// write code here
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
执行过程: