本文目錄一覽:
- 1、java 單鏈表頭插入: Link newLink = new Link(); newLink.next = first; first = newLink;
- 2、java中 linklist出現空指針的問題
- 3、java中關於LinkList的問題
- 4、Java 中的 for(String link:links)是什麼意思?
- 5、執行程序時,出現link.exe出錯,是怎麼回事
java 單鏈表頭插入: Link newLink = new Link(); newLink.next = first; first = newLink;
不大對吧。你建了一個名為 newLink 類型為 Link的實例 ,newLink 個具體存在的。 你在 2)中執行 「 newLink.next = first; 」 這條語句,實際上就把 原來的 newLink 中的內容覆蓋了, 當然這時候你也訪問不到 原來那個 新申請的對象了。 這樣3)也毫無意義,因為newLink 與 first 是同一個 實例。
第一句執行:
▁▁▁▁▁▁ newLink ▁▁▁▁▁▁ first
┃ ┃
↓ ↓
┌————————————————————┐
│新分配的內存空間│ |原first指向的空│
│ │ │ 間 │
└————————————————————┘
第二句執行:
newLink▁▁▁ first
▕ ▕
▕ ▕
▕▁▁▁▁▁▁
↓
┌————————————————————┐
│新分配的內存空間│ |原first指向的空│
│ │ │ 間 │
└————————————————————┘
第三句執行:由於newLink 與 first 指向同一空間,所以第三步驟沒有實際意義。
newLink▁▁▁ first
▕ ▕
▕ ▕
▕▁▁▁▁▁▁
↓
┌————————————————————┐
│新分配的內存空間│ |原first指向的空│
│ │ │ 間 │
└————————————————————┘
java中 linklist出現空指針的問題
java中 linklist出現空指針的問題,集合沒有實例化吧就賦值了肯定空指針。
public static void main(String args[]) throws IOException{
int i,j,x,y;
TraceRecord path=new TraceRecord();
x=1;y=1;
System.out.print(“迷宮的路徑(0的部分)\n”);
for(i=0;i10;i++){
for(j=0;j12;j++)
System.out.print(MAZE[i][j]);
System.out.println();
}
while(x=ExitXy=ExitY){
MAZE[x][y]=2;
if(MAZE[x-1][y]==0){
x-=1;
path.insert(x, y);
}
else if(MAZE[x+1][y]==0){
x+=1;
path.insert(x, y);
}else if(MAZE[x][y-1]==0){
y-=1;
path.insert(x, y);
}else if(MAZE[x][y+1]==0){
y+=1;
path.insert(x, y);
}else if(chkExit(x,y,ExitX,ExitY)==1)
break;
else{
MAZE[x][y]=2;
path.delete();
x=path.last.x;
y=path.last.y;
}
}
System.out.print(“[老鼠走過的路徑(2的部分)]”);
for(i=0;i10;i++){
for(j=0;j12;j++)
System.out.print(MAZE[i][j]);
java中關於LinkList的問題
//單鏈表類
package dataStructure.linearList;
import dataStructure.linearList.Node; //導入單鏈表結點類
import java.util.Iterator; //導入迭代器介面
public class SinglyLinkedListE extends AbstractListE implements LListE //單鏈表類,實現線性表介面
{
protected NodeE head; //頭指針,指向單鏈表第1個結點
public SinglyLinkedList() //構造空單鏈表
{
this.head = null;
}
public SinglyLinkedList(NodeE head) //構造指定頭指針的單鏈表
{
this.head = head;
}
public boolean isEmpty() //判斷單鏈表是否為空,O(1)
{
return this.head==null;
}
public int length() //返回單鏈表長度
{ //單鏈表遍歷演算法,O(n)
int i=0;
NodeE p=this.head;
while (p!=null)
{
i++;
p = p.next;
}
return i;
}
public E get(int index) //返回序號為index的對象,index初值為0
{ //若單鏈表空或序號錯誤返回null,O(n)
if (this.head!=null index=0)
{
int j=0;
NodeE p=this.head;
while (p!=null jindex)
{
j++;
p = p.next;
}
if (p!=null)
return (E)p.data;
}
return null;
}
public E set(int index, E element) //設置序號為index的對象為element,O(n)
{ //若操作成功返回原對象,否則返回null
if (this.head!=null index=0 element!=null)
{
int j=0;
NodeE p=this.head;
while (p!=null jindex)
{
j++;
p = p.next;
}
if (p!=null)
{
E old = (E)p.data;
p.data = element;
return old; //若操作成功返回原對象
}
}
return null; //操作不成功
}
public boolean add(int index, E element) //插入element對象,插入後對象序號為index
{ //若操作成功返回true,O(n)
if (element==null)
return false; //不能添加空對象(null)
if (this.head==null || index=0) //頭插入
this.head = new NodeE(element, this.head);
else //單鏈表不空且index=1
{
int j=0;
NodeE p=this.head;
while (p.next!=null jindex-1) //尋找插入位置
{
j++;
p = p.next;
}
p.next = new NodeE(element, p.next);//中間/尾插入
}
return true;
}
public boolean add(E element) //在單鏈表最後添加對象,重載,O(n)
{
return add(Integer.MAX_VALUE, element);
}
public E remove(int index) //移去序號為index的對象,O(n)
{ //若操作成功返回被移去對象,否則返回null
E old = null;
if (this.head!=null index=0)
if (index==0) //頭刪除
{
old = (E)this.head.data;
this.head = this.head.next;
}
else //中間/尾刪除
{
int j=0;
NodeE p=this.head;
while (p.next!=null jindex-1) //定位到待刪除結點的前驅結點
{
j++;
p = p.next;
}
if (p.next!=null)
{
old = (E)p.next.data; //操作成功,返回原對象
p.next = p.next.next; //刪除p的後繼結點
}
}
return old;
}
public void clear() //清空單鏈表,O(1)
{
this.head = null;
}
public String toString() //返回顯示單鏈表所有元素值對應的字元串
{ //單鏈表遍歷演算法,O(n)
String str=”(“;
NodeE p = this.head;
while (p!=null)
{
str += p.data.toString();
p = p.next;
if (p!=null)
str += “, “;
}
return str+”)”;
}
//以上實現LList介面,第2章
//以下2.4 迭代器內容
public IteratorE iterator() //返回一個迭代器對象
{
return new Itr();
}
private class Itr implements IteratorE //私有內部類,實現迭代器介面
{
private NodeE cursor = head;
public boolean hasNext() //若有後繼元素,返回true
{
return cursor!=null cursor.next!=null;
}
public E next() //返回後繼元素
{
if (cursor != null cursor.next!=null)
{
E element = cursor.next.data;
cursor = cursor.next;
return element;
}
return null;
}
public void remove() //不支持該操作
{
throw new UnsupportedOperationException();
}
}//內部類Itr結束
//以下第8章 8.2.1 順序查找,散列表中用
public NodeE search(E element, NodeE start) //從單鏈表結點start開始順序查找指定對象
{ //若查找成功返回結點,否則返回null
if (this.head==null || element==null)
return null;
NodeE p=start;
while (p!=null !element.equals(p.data))
{
System.out.print(p.data+”? “);
p = p.next;
}
return p;
}
public NodeE search(E element) //順序查找指定對象
{
return search(element, head);
}
/*
public boolean contain(E element) //以查找結果判斷單鏈表是否包含指定對象
{ //若包含返回true,否則返回false
return this.search(element)!=null;
}
*/
public boolean remove(E element) //移去首次出現的指定對象,O(n)
{ //若操作成功返回true
if (this.head==null || element==null)
return false;
if (element.equals(this.head.data))
{
this.head = this.head.next; //頭刪除
return true;
}
NodeE front=this.head, p=front.next; //中間/尾刪除
while (p!=null !element.equals(p.data))
{
front = p;
p=p.next;
}
if (p!=null)
{
front.next = p.next;
return true;
}
return false;
}
//以下是第2章習題
public SinglyLinkedList(E[] element) //由指定數組中的多個對象構造單鏈表
{
this.head = null;
if (element!=null element.length0)
{
this.head = new Node(element[0]);
NodeE rear=this.head;
int i=1;
while (ielement.length)
{
rear.next = new Node(element[i++]);
rear = rear.next;
}
}
}
public void concat(SinglyLinkedList list) //將指定單鏈表list鏈接在當前單鏈表之後
{
if (this.head==null)
this.head = list.head;
else
{
NodeE p=this.head;
while (p.next!=null)
p = p.next;
p.next = list.head;
}
}
public SinglyLinkedList(SinglyLinkedListE list) //以單鏈表list構造新的單鏈表
{ //複製單鏈表
this.head = null;
if (list!=null list.head!=null)
{
this.head = new Node(list.head.data);
NodeE p = list.head.next;
NodeE rear = this.head;
while (p!=null)
{
rear.next = new NodeE(p.data);
rear = rear.next;
p = p.next;
}
}
}
//遞歸方法
// public SinglyLinkedList(SinglyLinkedListE list) //以單鏈表list構造新的單鏈表
public void copy(SinglyLinkedListE list) //複製單鏈表
{
this.head = copy(list.head);
}
private NodeE copy(NodeE p) //複製單鏈表,遞歸方法
{
NodeE q=null;
if (p!=null)
{
q = new Node(p.data);
q.next = copy(p.next);
}
return q;
}
/*//遞歸方法
public String toString()
{
return “(“+ this.toString(this.head) +”)”;
}
public String toString(NodeE p) //遞歸方法
{
if (p!=null)
return p.data.toString() + “, ” + this.toString(p.next); //遞歸調用
return “”;
}
public SinglyLinkedList(E[] element) //由指定數組中的多個對象構造單鏈表
{
this.head = null;
if (element!=null)
this.head = create(element,0);
}
private NodeE create(E[] element, int i) //由指定數組構造單鏈表
{ //遞歸方法
NodeE p=null;
if (ielement.length)
{
p = new Node(element[i]);
p.next = create(element, i+1);
}
return p;
}
*/
public boolean equals(Object obj) //比較兩條單鏈表是否相等
{
if (obj == this)
return true;
if (obj instanceof SinglyLinkedList)
{
SinglyLinkedList list = (SinglyLinkedList)obj;
return equals(this.head, list.head);
}
return false;
}
private boolean equals(NodeE p, NodeE q) //比較兩條單鏈表是否相等,遞歸方法
{
if (p==null q==null)
return true;
if (p!=null q!=null)
return p.data.equals(q.data) equals(p.next, q.next);
return false;
}
//以下是第8章習題
public boolean replace(Object obj, E element)//將元素值為obj的結點值替換為element,O(n)
{ //若替換成功返回true,否則返回false
if (obj==null || element==null)
return false;
NodeE p=this.head;
while (p!=null)
{
if (obj.equals(p.data))
{
p.data = element;
return true;
}
p = p.next;
}
return false;
}
public boolean replaceAll(Object obj, E element) //將所有元素值為obj的結點值替換為element,O(n)
{ //若替換成功返回true,否則返回false
boolean done=false;
if (obj!=null element!=null)
{
NodeE p=this.head;
while (p!=null)
{
if (obj.equals(p.data))
{
p.data = element;
done = true;
}
p = p.next;
}
}
return done;
}
public boolean removeAll(Object obj) //將所有元素值為obj的結點刪除
{
if (this.head==null || obj==null)
return false;
boolean done=false;
while (this.head!=null obj.equals(this.head.data))
{
this.head = this.head.next; //頭刪除
done = true;
}
NodeE front=this.head, p=front.next;
while(p!=null)
{
if (obj.equals(p.data))
{
front.next = p.next; //刪除p結點
p = front.next;
done = true;
}
else
{
front = p;
p = p.next;
}
}
return done;
}
public static void main(String[] args)
{
String[] letters={“A”,”B”,”C”,”D”,”E”,”F”};
SinglyLinkedListString list1 = new SinglyLinkedListString(letters);
SinglyLinkedListString list2 = new SinglyLinkedListString(list1);
list2.copy(list1);
System.out.println(list2.toString());
System.out.println(“equals(), “+list2.equals(list1));
}
}
/*
程序運行結果如下:
(A, B, C, D, E, F)
*/
/* 第2章 //可行,但效率低,時間複雜度是O(n*n)。
public String toString()
{
String str=”{“;
if (this.length()!=0)
{
for(int i=0; ithis.length()-1; i++)
str += this.get(i).toString()+”, “;
str += this.get(this.length()-1).toString();
}
return str+”}”;
}
*/
Java 中的 for(String link:links)是什麼意思?
這是自JDK1.5之後新出來的比較簡潔的for循環語句,就相當於
for(int i = 0;i links.length();i ++),
你這裡的link是新創建的一個String對象的引用,而links是你之前定義過的一個String字元串,不知道你聽明白沒有.建議你還是多敲敲就知道了.
PS : 本人還是喜歡傳統的for循環的寫法,因人而異
執行程序時,出現link.exe出錯,是怎麼回事
其實這樣的鏈接問題我也遇到不少,不過最後還是都解決了,對於鏈接問題,要看幾點:第一,調用函數所在的鏈接庫是否跟運行程序在一個文件夾里(如debug);第二,所調用的函數類型及參數是否跟應用程序中所聲明的回調函數一樣;第三,就是要注意在應用程序里聲明回調函數的時候應加上相應的修飾符,如(WINAPI,_stdcall…..等),不過如果是win32的DLL則不需要加這些修飾符。 你的問題估計就是第一個問題吧,也許你所允許的這個程序需要其它的DLL文件。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/286495.html