复制链表
方法1 :先拼接 再拆分
/* // 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 { //避免null.next public Node copyRandomList(Node head) { if(head == null) return null; Node cur =head; //7 7 13 13 11 11 10 10 1 1 null while(cur!=null){ Node tmp = new Node(cur.val); tmp.next =cur.next; cur.next =tmp; cur = cur.next.next; } cur= head; //修改新的链表random while(cur!=null){ if(cur.random!=null){//如果cur.random==null,cur.random.next:NullPointerException cur.next.random =cur.random.next; } cur =cur.next.next; } cur =head; Node last =head.next,so=head.next; // while(xx!=null){ // x.next =x.next.next; // xx.next = xx.next.next;//xx.next已经是null,NullPointerException // x =x.next; // xx = xx.next; // } while(last.next!=null){ cur.next =cur.next.next; last.next = last.next.next; cur =cur.next; last = last.next; } cur.next = null;//xx.next已经是null,两条链表最后都是null return so;//last已经是新链表的最后面,所以要返回so } }
方法2 Map 先存下来,再遍历修改next 和random
让每个单独的节点形成链表
/* // 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 { HashMap<Node,Node> map = new HashMap(); public Node copyRandomList(Node head) { if(head == null) return null; Node cur = head; while(cur!=null){ Node tmp = new Node(cur.val); map.put(cur,tmp); cur = cur.next; } cur = head; while(cur!=null){ map.get(cur).next = map.get(cur.next); map.get(cur).random = map.get(cur.random); cur = cur.next; } return map.get(head); } }