1. 程式人生 > >複雜連結串列的複製(Java實現)

複雜連結串列的複製(Java實現)

該題為劍指offer面試題26


  • 熱度指數:70797  
    時間限制:1秒  空間限制:32768K
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
package go.jacob.day430;

public class Demo1 {
	public RandomListNode Clone(RandomListNode pHead) {
		createDoubleNode(pHead);

		connectRandomNode(pHead);

		RandomListNode newHead = ReconnectNodes(pHead);
		return newHead;

	}

	/*
	 * 複製節點,把新建的節點A‘連線在原節點A後
	 */
	private void createDoubleNode(RandomListNode pHead) {
		RandomListNode tmpNode = pHead;
		while (tmpNode != null) {
			RandomListNode node = new RandomListNode(tmpNode.label);
			node.next = tmpNode.next;
			tmpNode.next = node;
			tmpNode = node.next;
		}
	}

	/*
	 * 連結random節點,eg. 在原連結串列中A的random是B,那麼在新連結串列中,A’連結B‘
	 */
	private void connectRandomNode(RandomListNode pHead) {
		RandomListNode tmpNode = pHead;
		while (tmpNode != null) {
			if (tmpNode.random != null) {
				RandomListNode node = tmpNode.next;
				node.random = tmpNode.random.next;
				tmpNode = node.next;
			} else {
				tmpNode = tmpNode.next.next;
			}
		}
	}

	/*
	 * 把兩個相連的連結串列拆分成兩個
	 */
	private RandomListNode ReconnectNodes(RandomListNode pHead) {
		if (pHead == null)
			return null;
		RandomListNode tmpNode = pHead;
		RandomListNode newHead = pHead.next;

		while (tmpNode != null) {
			RandomListNode node = tmpNode.next;
			tmpNode.next = node.next;
			if (node.next != null)
				node.next = node.next.next;
			else
				node.next = null;
			tmpNode = tmpNode.next;
		}

		return newHead;
	}

	// 節點類
	public class RandomListNode {
		int label;
		RandomListNode next = null;
		RandomListNode random = null;

		RandomListNode(int label) {
			this.label = label;
		}
	}
}


相關推薦

複雜連結串列複製Java實現

該題為劍指offer面試題26 熱度指數:70797  時間限制:1秒  空間限制:32768K 輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指

資料結構之連結串列操作c++實現

1、單向連結串列(頭結點不含資料,不佔長度),C++實現: #include <iostream> #include <stack> using namespace std; /*****定義節點****/ typedef struct node{ int va

複雜連結串列拷貝面試題

這是《Google等公司資料結構+演算法面試》上的一道題,原題如下: 下圖是一個含有5個結點的該型別複雜連結串列。 圖中實線箭頭表示m_pNext指標,虛線箭頭表示m_pSibling指標。為簡單起見, 指向NULL的指標沒有畫出。                  

Java基於連結串列與基於陣列實現

基於陣列實現 package com.ma.stack; /** * @author sunfch *此棧實現基於陣列,初始棧時已經設定棧大小 */ public class MyArrayStack { private int size; private int top = -1

資料結構-連結串列java實現

/** * 連結串列節點定義 * */ private class Node { private Object data; private Node next; public Node getNext() { return next;

LeetCode第23題:合併K個有序連結串列JAVA實現

題目: 我的解答: 思路很簡單,把所有的資料先讀到ArrayList中然後轉到陣列中,然後排序,然後構建新連結串列 程式碼: /** * Definition for singly-linked list. * public class ListNode {

無序連結串列實現順序查詢Java實現

連結串列中的每個結點儲存一個鍵值對,get()的實現即為遍歷連結串列,equals()方法比較需要被查詢的鍵和每個結點中的鍵,如果匹配成功就返回相應的值,否則返回null。put()的實現也是遍歷連結串

劍指offer之兩個連結串列的第一個公共點Java實現

兩個連結串列的第一個公共點 輸入兩個連結串列,找出它們的第一個公共結點 思路:我們先遍歷找到兩個連結串列的長度m和n, 如果m大,m比n大多少,比如說k,那麼先讓m先走k步,然後n和m再一起走。

連結串列排序演算法java實現連結串列的快速排序、插入排序、歸併排序

難易程度:★★ 重要性:★★★      連結串列的排序相對陣列的排序更為複雜些,也是考察求職者是否真正理解了排序演算法(而不是“死記硬背”) 連結串列的插入排序 public class LinkedInsertSort { static cla

LeetCode第24題:兩兩交換連結串列的節點JAVA實現

題目: 我的解答: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(i

常見連結串列操作-刪除連結串列倒數第n個節點JAVA實現

問題 給出一個單向連結串列,刪除該連結串列倒數第n個節點,並返回頭節點。 例如: 給出連結串列 1->2->3->4->5,n=2 返回連結串列 1->2->3->5 解題思路 最容易想到的演算法: 先遍歷一次連結串列,

常見連結串列操作-求連結串列的中間節點JAVA實現

問題 給出任意單向連結串列,找出並返回該連結串列的中間節點。 奇數長度的連結串列,例如:1->2->3->4->5 返回節點 3 偶長度的連結串列,例如:1->2->3->4->5->6 返回節點 4 解題思

leetcode206. 反轉連結串列java實現

題目:反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 思路: 迭代:讓當前節點的下一個節點是前節點,然後當前節點和下一個節點分別往後移。

劍指offer之連結串列中環的入口Java實現

連結串列中環的入口 NowCoder 題目描述: 給一個連結串列,若其中包含環,請找出該連結串列的環的入口結點,否則,輸出null。 ###解題思路: 第一步,找環中相匯點。分別用p1,p2指向連結串列頭部,p1每次走一步,p2每次走二步,直到p1==p2找到在環中的

劍指offer之刪除連結串列中重複的結點Java實現

刪除連結串列中重複的結點 NowCoder 題目描述: 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->

劍指offer之從尾到頭列印連結串列Java實現

從尾到頭列印連結串列 NowCoder 題目描述: 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。 ###解題思路: 解法一:利用遞迴 import java.util.ArrayList; public class Solution {

劍指offer面試題6:從尾到頭列印連結串列Java實現

題目:輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。 思路:因為要實現從頭到尾遍歷,然後從尾到頭列印,也就是說第一個遍歷到的最後一個列印,最後遍歷到的第一個列印,這很明顯符合棧 “先進後出” 的特點,所以我們可以利用棧來實現這種順序。 測試用例: 功能測試:

兩個有序連結串列序列的合併java實現

02-線性結構1 兩個有序連結串列序列的合併(15 分)本題要求實現一個函式,將兩個連結串列表示的遞增整數序列合併為一個非遞減的整數序列。函式介面定義:List Merge( List L1, List L2 );輸入樣例:3 1 3 5 5 2 4 6 8 10 輸出樣例:

leetcode連結串列題--刪除連結串列的倒數第N個節點java實現

原題 給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。 示例: 給定一個連結串列: 1->2->3->4->5, 和 n = 2. 當刪除了

連結串列:刪除連結串列中重複的結點java實現

題目描述 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->