考察点
链表遍历
知识点
题目
分析
这道题目要求复制链表,链表结点除了值和next指针以外还有一个指针指向该链表中任意一个结点。这道题目最直观的解法就是先把含有next指针的链表复制出来,然后再次遍历链表设置第二个指针,方法是判断下第二个指针指向的结点距离当前结点的距离,在最新的链表上按照这个距离设置即可,这种方式非常消耗时间复杂度。其实这种方式没有充分利用第二个指针。
假设链表为1-2-3-4-5,我们可以在原链表上直接复制1-1’-2-2’-3-3’-4-4’-5-5’,然后如果1的第二个指针指向了3,那么让1’的第二个指针非常好设置即3的next,最后再把这个最新的指针拆开即可
public class LinkNode {int val;LinkNode next;LinkNode pSibing;public LinkNode(int data) {this.val = data;this.next = null;this.pSibing = null;}
}
public class LinkList {LinkNode head;public LinkList() {this.head = null;}//添加元素public void addNode(int data) {LinkNode node = new LinkNode(data);if (this.head == null) {this.head = node;} else {LinkNode cur = this.head;while(cur.next != null) {cur = cur.next;}cur.next = node;}}//添加pSibingpublic void setPsibing(int firstData,int endData) {LinkNode firstNode = getNode(firstData);LinkNode endNode = getNode(endData);if (firstNode != null && endNode != null) {firstNode.pSibing = endNode;}}public LinkNode getNode(int data) {LinkNode node = this.head;while(node != null) {if (node.val == data) {return node;}node = node.next;}return null;}//正序打印public void print(LinkNode linkNode) {LinkNode node = null;if (node != null) {node = linkNode;} else {node = this.head;}while(node != null) {System.out.print(node.val);System.out.print(" ");if (node.pSibing != null) {System.out.print(node.pSibing.val);}System.out.println();node = node.next;}System.out.println();}public LinkNode clone() {LinkNode node = this.head;while(node != null) {LinkNode cloneNode = new LinkNode(node.val);cloneNode.next = node.next;node.next = cloneNode;node = cloneNode.next;}node = this.head;while(node != null) {if (node.pSibing != null) {node.next.pSibing = node.pSibing.next;}node = node.next.next;}node = this.head;LinkNode cloneHead = node.next;while(node != null) {LinkNode cloneNode = node.next;node.next = cloneNode.next;node = node.next;if (node != null) {cloneNode.next = node.next;cloneNode = cloneNode.next;}}return cloneHead;}
}
public class TwentySix {public static void main(String[] args) {LinkList linkList = new LinkList();linkList.addNode(1);linkList.addNode(2);linkList.addNode(3);linkList.addNode(4);linkList.addNode(5);linkList.setPsibing(1,3);linkList.setPsibing(4,2);linkList.setPsibing(2,5);linkList.print(null);LinkNode node = linkList.clone();linkList.print(node);linkList = new LinkList();linkList.addNode(1);node = linkList.clone();linkList.print(node);}
}