NC78:反转链表
链接: 反转链表.
1.解题思路
描述
输入一个链表,反转链表后,输出新链表的表头。
示例1
输入:{1,2,3}
返回值:{3,2,1}
核心思路:
1.定义三个引用初始情况下分别指向head的前一个结点(prevNode),head(curNode),head的后一个结点(nextNode);
2.只要当前节点不为空,就循环将当前节点的前一个结点赋给后一个结点,即“掰道岔”;
curNode.next = prevNode;
3.三个引用循环后移,直到nextNode为空时,当前节点为链表的尾节点,也就是反转后链表的头结点;
2.代码实现
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null){
return null;
}
if(head.next == null){
return head;
}
ListNode curNode = head;
ListNode prevNode = null;
ListNode newHead = null;
while(curNode != null){
//循环条件为什么不是nextNode!=null?
//因为当curNode为尾节点的时候还需要进行最后一次掰道岔,需要执行循环体
//如果循环条件是nextNode!=null,当curNode为尾节点时,
//此时nextNode已经为空跳出循环,但却还没进行最后一次掰道岔
ListNode nextNode = curNode.next;
if(nextNode == null){
//nextNode为空,curNode指向尾节点,即反转链表的新头结点
newHead = curNode;
}
curNode.next = prevNode;//掰道岔
prevNode = curNode;
curNode = nextNode;
}
return newHead;
}
}
细节总结:
1.因为核心操作中curNode.next变成了prevNode,破坏了链表结构,所以定义nextNode的目的就是让curNode找到下一个位置;
2. 因为当curNode为尾节点的时候还需要进行最后一次掰道岔,要执行循环体,所以循环结束的条件不是nextNode== null,而是curNode == null时才跳出循环