单链表反转

253 阅读1分钟

题目描述: 反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:

迭代或递归地反转链表。


image.png

情况分析:

(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;

image.png


/**
* 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;
    }
}