问题描述
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例
分析
解法一:
使用头插法返回一个新的结果链表,因为头插法产生的链表就是逆序的。因此刚好就是反转过来的链表。
解法二:
使用双指针,直接将链表中的指针全部改变方向,最终产生的链表就是反转过来的链表。
如图:
定义一个preNode初始化为null,一个nextNode指向头节点。定义一个tempNode临时节点保存nextNode.next。
首先用tempNode保存当前节点的下一个节点,然后将当前节点指向preNode。
preNode与当前节点nextNode再后移。
重复上述过程直至nextNode为空,此时整个链表指针全部改变了方向。
返回preNode就是反转好的链表。
代码实现
解法一:
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) return null;
ListNode result = new ListNode();
ListNode curHead = head;
while (curHead != null) {
ListNode temp = curHead; //取出一个节点
curHead = curHead.next; //移至下一个节点
temp.next = result.next; //头插法
result.next = temp;
}
return result.next;
}
}
解法二:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode preNode = null, nextNode = head;
ListNode tempNode;
while (nextNode != null) {
tempNode = nextNode.next; //保存下一个节点
nextNode.next = preNode; //将指针指向前面的节点
preNode = nextNode; //preNode后移
nextNode = tempNode; //nextNode后移
}
return preNode;
}
}