学习计划剑指offer: 第二天

107 阅读1分钟

从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

输入: head = [1,3,2]
输出: [2,3,1]

限制:

0 <= 链表长度 <= 10000

leetcode-cn.com/problems/co…

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
        if(head == null){
            return new int[0];
        }

        ListNode dummy = new ListNode();
        ListNode node = head;
        int i=0;
        while(node != null){
            ListNode temp = node.next;
            node.next = dummy.next;
            dummy.next = node;
            node = temp;
            i++;
        }

        int[] arr = new int[i];
        int j=0;
        node = dummy.next;
        while(node != null){
            arr[j] = node.val;
            node = node.next;
            j++;
        }
        return arr;
    }
}

反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点

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

限制:

0 <= 节点个数 <= 5000

leetcode-cn.com/problems/fa…

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode dummy = new ListNode();
        ListNode node = head;
        while(node != null){
            ListNode temp = node.next;
            node.next = dummy.next;
            dummy.next = node;
            node = temp;
        }
        return dummy.next;
    }
}

复杂链表的复制

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
输入: head = [[1,1],[2,1]]
输出: [[1,1],[2,1]]
输入: head = [[3,null],[3,0],[3,null]]
输出: [[3,null],[3,0],[3,null]]
输入: head = []
输出: []
解释: 给定的链表为空(空指针),因此返回 null。

提示:

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。
/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/
class Solution {
    public Node copyRandomList(Node head) {
        if(head == null){
            return head;
        }

        Node node = head;
        while(node !=null){
            Node newNode = new Node(node.val);
            newNode.next = node.next;
            node.next = newNode;
            node = node.next.next;
        }
        node = head;

        while(node != null){
            if( node.random != null){
                node.next.random = node.random.next;
            }
            node = node.next.next;
        }

        node = head;
        Node dummy = head.next;
        while(node != null){
            Node temp = node.next;
            node.next = node.next.next;
            node = node.next;
            if(node != null){
                temp.next = node.next;
            }
        }
        return dummy;
    }
}