题目描述: 反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
迭代或递归地反转链表。
情况分析:
(1)由于以前写过一个头插法,可以依次向下遍历,将第二个元素头插法插入成为新的头,再依次向下。(头插法插入的是这个节点的数据域,而不是这个节点)
//关键代码
//头插法
public void addFirst(int val) {
listNode node = new ListNode(val);
node.next = head;
head = node;
}
(2) 根据头插法,我们发现,对于改变元素而言,我们需要关注三个量,这个节点的前一个节点,这个节点,和记录它的下一个节点,所以可以很简单的设置三个变量,cur,prev,newHead,cur代表这个需要被改变的量
ListNode cur = head; //需要翻转的节点
ListNode prev = null; //代表当前需要翻转的这个节点的前驱
ListNode newHead = null; // 这个代表目前为止这个链表中的新的头节点
while(cur != null) {
ListNode curNext = cur.next; //代表需要翻转的下一个节点
if(curNext == null) {
newHead = cur;
}
cur.next = prev;
prev = cur;
cur = cur.next;
}
return newHead;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode cur = head;
ListNode newHead = null;
while(cur != null) {
ListNode curNext = cur.next;
if(cur.next == null) {
newHead = cur;
}
cur.next = prev;
prev = cur;
cur = curNext;
}
return newHead;
}
}