24、反转链表

输入一个链表,反转链表后,输出新链表的表头。

思路:需要定义3个指针,分别指向当前遍历到的节点、它的前一个节点及后一个节点。

测试用例:

(1)输入的链表头指针是null

(2)输入的链表只有一个节点

(3)输入的链表有多个节点

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
        public ListNode ReverseList(ListNode head) {
        if(head == null || head.next == null)
            return head;
        ListNode newHead = null;
        ListNode curNode = head, prevNode = null;
        while(curNode != null){
            ListNode nextNode = curNode.next;
            if(nextNode == null)
                newHead = curNode;
            curNode.next = prevNode;
            prevNode = curNode;
            curNode = nextNode;
        }
        return newHead;
    }
}

递归解法实现反转链表:

    public ListNode ReverseList(ListNode head) {
         if(head == null || head.next == null)
            return head;
        
        //先反转后面的链表,走到链表的末端结点
        ListNode pReverseNode = ReverseList(head.next);
         
        //再将当前节点设置为后面节点的后续节点
        head.next.next = head;
        head.next = null;
        return pReverseNode;
    }

猜你喜欢

转载自www.cnblogs.com/Aug-20/p/11817118.html