leetcode反转链表

问题描述

反转一个单向链表 题目地址

Example

输入: 1->2->3->4->5->null

输出: 5->4->3->2->1->null

思路分析

currNode 当前正在遍历的节点(原链表头节点)
prevNode 新链表节点头节点(最初新链表为空所以初始值为null)

因为每次遍历时, 都会修改当前遍历节点的 next 所以每次修改前应该先记录当前的 next 即原链表修改后的头节点


ListNode nextTemp = currNode.next;

每一次遍历时, 只需要将 currNode 节点的 next 指向 prevNode 节点, 即:

currNode.next = prevNode;

此时新链表前面多了一个节点, 所以需要将 prevNode 即:

prevNode = currNode;

代码实现

package com.alan.leetcode;

public class ReverseLinkedList {
    public static void main(String[] args) {
        ListNode listNode = new ListNode(1);
        ListNode head = listNode;
        for (int i=2; i<10; i++) {
            listNode.next = new ListNode(i);
            listNode = listNode.next;
        }

        ListNode curr = head;
        while (curr!=null) {
            System.out.print(curr.val+"->");
            curr = curr.next;
        }
        System.out.println((Object) null);
        System.out.println("-------------------开始反转------------------------");
        Solution solution = new Solution();
        ListNode newListNode = solution.reverseList(head);
        curr = newListNode;

        while (curr!=null) {
            System.out.print(curr.val+"->");
            curr = curr.next;
        }
        System.out.println((Object) null);
    }
}

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;

        while (curr != null) {
            ListNode nextTemp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = nextTemp;
        }
        return prev;
    }
}

/**
 * Definition for singly-linked list.
 */
class ListNode {
    int val;
    ListNode next;
    ListNode(int val) {
        this.val = val;
    }
}