反转一个单链表
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思维逻辑图如下:
我们首先设定一个
prev:前驱,当前需要反转节点的前一个节点;
cur:当前需要反转的节点,要记录下当前节点,方便你找到;
curNext:代表下一个需要反转的节点;
newHead:反转后的单链表的新头节点。
如果当前节点不为空则进入循环,当下一个节点为空,即只有一个节点,新头即为当前节点。让当前节点指向上一个节点的地址,完成反转返回新的单链表。
程序代码如下:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode newHead = null;
ListNode cur = head;
while (cur != null) {
//如果当前节点不为空则进入循环
ListNode curNext = cur.next;
if(curNext == null) {
//如果下一个节点为空,即只有一个节点,新头即为当前节点
newHead = cur;
}
//让当前节点指向上一个节点的地址,完成反转
cur.next = prev;
prev = cur;
cur = curNext;
}
//返回新的单链表
return newHead;
}
}
还有一种简单的方法,可以利用头插法,将头节点后面的节点依次头插到头节点的前面,大家可以自己试一下。