1.反轉乙個單鏈表。
public class mysinglelinkedlmpl
private int data;
public node next;
public node(int data)
}//節點類
private node head;
public mysinglelinkedlmpl()
public node reverselist()
cur.next=prev;
prev=cur;
cur=curnext;
}return reversehead;
}}
2.給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。
public class mysinglelinkedlmpl
private int data;
public node next;
public node(int data)
}//節點類
private node head;
public mysinglelinkedlmpl()
public node detectcycle()
}//沒有環
if(fast==null || fast.next.next==null)
//將slow拉到頭,然後和fast一人一步走
slow=this.head;
while (fast!=slow)
return slow;
}}
3.判斷鍊錶是否有環。
public class mysinglelinkedlmpl
private int data;
public node next;
public node(int data)
}//節點類
private node head;
public mysinglelinkedlmpl()
public boolean hascycle()
}return false;
}}
4.鍊錶的回文結構。
public class mysinglelinkedlmpl
private int data;
public node next;
public node(int data)
}//節點類
private node head;
public mysinglelinkedlmpl()
public boolean chkpalindrome()
//slow指向的位置就是中間位置
node p=slow.next;
node pnext=p.next;
while (p!=null)
}//後半部分已經進行反轉
while (this.head!=slow)
if(this.head.next==slow)
head=head.next;
slow=slow.next;
}return true;
}}
5.在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭
指標。
public class mysinglelinkedlmpl
private int data;
public node next;
public node(int data)
}//節點類
private node head;
public mysinglelinkedlmpl()
public node deleteduplication()
cur=cur.next;
//cur指向的這個節點和前面的節點不同
tmphead.next=cur;
}else
}return node.next;
}}
鏈表面試題(一)
1.刪除無頭鍊錶的非尾結點。解題思路 因為不知道pos的前乙個結點,所以只能刪除pos的後乙個結點。首先,把pos下乙個結點的data賦值給pos的data,然後把pos和pos的下下乙個結點連線,最後刪除pos的下乙個結點。剛開始的鍊錶如下圖所示 經分析後得到的圖如下 如下 void erasen...
鏈表面試題
不改變鍊錶結構,從尾到頭列印單鏈表 遞迴實現 void printlistrevers recursively plist phead printf d phead data 當鍊表非常長的時候,遞迴實現的會導致函式呼叫層級很深,可能導致呼叫棧溢位。用棧不會出現此類情況,顯然用棧實現 的魯棒性會好一...
鏈表面試題
從尾到頭列印單鏈表 棧 遞迴 從尾到頭列印鍊錶 includevoid printtailtohead listnode head while s.empty 空間複雜度o n void printtailtoheadr listnode head cout data 刪除乙個無頭單鏈表的非尾結點 ...