導航:首頁 > 編程語言 > 反轉單鏈表java

反轉單鏈表java

發布時間:2022-04-24 20:08:30

㈠ 用java來編寫一個單鏈表類的成員函數,實現對頭結點的單鏈表就地逆置的操作

逆置有兩種方法,第一是把所有節點反過來。還有一種就是改變節點中的值。
第一種情況,其實可以考慮用頭插法,來實現逆置。
下面的演算法是基於頭插法的思想,逆置鏈表的,僅供參考。
LinkList anti_linklist(LinkList demo)
{
LInkList *p,*q;//work pointer
LinkList head;
head=new LinkList();
head->next=null;//init head pointer
p=demo->head->next;//make p points to the first node
if(p==null)
return null;//the linklist is null
while(p!=null)
{
q=p;
q->next=head->next;
head->next=q;
p=p->next;
}
}

㈡ 用Java實現的數據鏈表翻轉程序

publicclassMain{
staticclassNode<T>{
Tdata;
Node<T>next;
privateNode(Tdata,Node<T>next){
this.data=data;
this.next=next;
}
}

publicstaticvoidmain(String[]args){
Node<Integer>l=newNode<Integer>(null,newNode<Integer>(1,newNode<Integer>(2,newNode<Integer>(3,newNode<Integer>(4,newNode<Integer>(5,null))))));
Node<Integer>curr=l;
if(reverseAt(l,3)){
while((curr=curr.next)!=null)
System.out.println(curr.data);
}
}

@SuppressWarnings("unchecked")
publicstatic<T>booleanreverseAt(Node<T>h,intp){//hadheadnode
if(p<1)//invalidposition
returnfalse
Object[]l=newObject[p];
Node<T>curr=h.next;
for(inti=0;i<p&&curr!=null;i++,curr=curr.next){//save
l[i]=curr;
}
if(curr==null){//pbiggerthanthelistlength;
returnfalse;
}
for(inti=p-1;i>0;i--){//reverse
((Node<T>)l[i]).next=((Node<T>)l[i-1]);
}
((Node<T>)l[0]).next=curr;//link
h.next=(Node<T>)l[p-1];//head
returntrue;
}

}

㈢ 請用C或者Java語言寫出實現將單向鏈表順序反轉的函數。

ListItem* reverseList(ListItem *pHead){
ListItem *p1,*p2;
p1=pHead;
p2=0;
while(p1!=0){
pHead=p1;
p1=p1->next;
pHead->next=p2;
p2=pHead;
}
return pHead;
}

㈣ Java語言寫出實現將單向鏈表順序反轉的函數

假設鏈表的節點定義如下:
class Node{
int i;
Node next;
}
那麼其反轉函數為:

void reverse(Node l){
if(l==null) return;
Node p=null,q=l,r=l.next;
while(r!=null){
q.next=p;
p=q;
q=r;
r=r.next;
}
q.next=p;
l=q;
}

㈤ 數據結構,單鏈表反轉問題,

扣著的是頭節點(頭子)

車是首節點(首子)

馬是次節點(次子)

牙簽細的是指針指向,香頭發黑的是指向,鐵頭細的是指向。

根據步驟寫程序的偽演算法(3步4循環,7張圖片搞定),如下:


第一個循環把馬弄到車前面,

第二個循環把相弄到馬前面

第三個循環把士弄到相前面

........

直到香指向為空後停止循環。

代碼如下:只需要一個首結點pHead,就能把鏈表找到,並倒置。具體代碼如下

p香=pHead->pNext;

p鐵=p香->pNext;

p香->pNext=NULL;

P香=p鐵

while(p香 !=NULL)

{

p鐵=p香->pNext;

p香->pNext=pHead->pNext;

pHead->pNext=p香;

p香=p鐵;

}


對照偽演算法(三步四循環),和上面的代碼是一一對應的:

第一步:香頭指向首子,鐵頭指向次子

第二步:刪掉首子指向次子(鐵頭所指向的那個子)的牙簽

第三步:香頭跟著鐵頭

以下循環條件:(條件:香頭指向不為空)

{

循環1:鐵頭移動到香頭的下一個指向

循環2:香頭的下一個指向首子

循環3:頭子的下一個跟著香頭

循環4:香頭跟著鐵頭

}

自己用道具操作幾遍,然後把流程背會,以後自己根據流程寫代碼即可。

㈥ java反轉鏈表 大神給我添加個注釋好么,我自己研究

publicclassLinktest{
//反轉方法,傳入一個鏈表
publicstaticLinkNodereversal(LinkNodelist){
//pre用來存放前一個鏈表節點
LinkNodepre=list;
//取出下一個鏈表節點,cru用來存放當前鏈表節點
LinkNodecru=list.getNext();
//next用來存放下一個鏈表節點
LinkNodenext;
//如果當前節點不為空(這里意思是如果傳進來的list有下一個節點就繼續執行)
while(null!=cru){
//取出當前節點的下一個節點
next=cru.getNext();
//把前一個節點賦予當前節點的下一個節點(這里產生實際改變)
cru.setNext(pre);
//把當前節點變數賦予前一個節點的變數
pre=cru;
//把下一個節點變數賦予當前
cru=next;
}
//循環體內會循環到方法傳入的LinkNode沒有前一個節點為止
//因為幾次交換的原因

//因為循環結束,所以把next賦空
list.setNext(null);
//因為循環的原因,前一個節點實際是第一個節點
list=pre;
//返回第一個節點
returnlist;
}
publicstaticvoidmain(String[]args){
LinkNodehead=newLinkNode(0);
LinkNodetmp=null;
LinkNodecur=null;
for(inti=1;i<10;i++){
tmp=newLinkNode(i);
if(1==i){
head.setNext(tmp);
}else{
cur.setNext(tmp);
}
cur=tmp;
}
LinkNodeh=head;
while(null!=h){
System.out.print(h.getVal()+"");
h=h.getNext();
}
head=reversal(head);
System.out.println(" **************************");
//列印反轉後的結果
while(null!=head){
System.out.print(head.getVal()+"");
head=head.getNext();
}
}
}

㈦ java linked list里的元素順序反過來

定義一個LinkedList<Integer> templist = new LinkedList<>();來存儲list裡面的值,通過迭代list,將值插入在templist的頭上,那麼templist就是list的反轉了,最後將templist賦值給list就行了!

如下代碼:

publicvoidreverse(){
LinkedList<Integer>list=newLinkedList<>();
LinkedList<Integer>templist=newLinkedList<>();
inti=0;
while(i<6){
list.add(i);
i++;
}
Iterator<Integer>it=list.iterator();
intm;
while(it.hasNext()&&i>=0){
m=it.next();
templist.addFirst(m);
i--;
}
list=templist;
System.out.println(list);
}

運行結果為:

5 4 3 2 1 0

從API中可以看到List等Collection的實現並沒有同步化,如果在多線程應用程序中出現同時訪問,而且出現修改操作的時候都要求外部操作同步化;調用Iterator操作獲得的Iterator對象在多線程修改Set的時候也自動失效,並拋出java.util.。這種實現機制是fail-fast,對外部的修改並不能提供任何保證。

Iterator是工作在一個獨立的線程中,並且擁有一個 mutex鎖,就是說Iterator在工作的時候,是不允許被迭代的對象被改變的。

Iterator被創建的時候,建立了一個內存索引表(單鏈表),這個索引表指向原來的對象,當原來的對象數量改變的時候,這個索引表的內容沒有同步改變,所以當索引指針往下移動的時候,便找不到要迭代的對象,於是產生錯誤。

List、Set等是動態的,可變對象數量的數據結構,但是Iterator則是單向不可變,只能順序讀取,不能逆序操作的數據結構,當 Iterator指向的原始數據發生變化時,Iterator自己就迷失了方向。

所以如果像下面這么寫就會拋出異常java.util.


publicvoidreverse(){
LinkedList<Integer>list=newLinkedList<>();
inti=0;
while(i<6){
list.add(i);
i++;
}
Iterator<Integer>it=list.iterator();
intm;
while(it.hasNext()&&i>=0){
m=it.next();
list.add(m);
list.remove(0);
i--;
}
System.out.println(list);
}

㈧ 如何實現單鏈表反轉

將每個結點依次插入新的空鏈表的頭結點和第一個結點之間
假設原鏈表頭結點是H;
typedef struct lnode *link;
link newH;

newH=(lnode *)malloc(sizeof(lnode));
newH->next=NULL;
link q,n;

p=H->next;
while(p!=NULL)
{
q=p;
p=p->next;
if(newH->next==NULL)
{
newH->next=q;
q->next=NULL;

}
else {
newH->next=q;
q->next=n;
}
n=q;
}

㈨ java:已知單鏈表H,利用棧的原理寫一個演算法將其倒置

import myjava.Node;
import myjava.SinglyLinkedList;
import myjava.SeqStack;
public class ReverseLinkedList<E> extends SinglyLinkedList<E> {
public ReverseLinkedList(){
super();
}
public void reverse(ReverseLinkedList<E> list){
SeqStack<E> stack = new SeqStack<E>();
Node<E> p = this.head ;
while(p != null){
stack.push(p.data);
p = p.next;
}
list.clear();
while(!stack.isEmpty()){

list.add(stack.pop());
}
}
public static void main (String[] args) {
ReverseLinkedList<Integer> list = new ReverseLinkedList<Integer>();
for(int i = 1;i < 6;i++){
list.add(0,new Integer(i));
}
System.out.println("單列表 "+list.toString());
list.reverse(list);
System.out.println("逆轉後 "+list.toString());
}
}

㈩ java數據結構,單鏈表的逆置

如圖吧,還是挺好理解的。

閱讀全文

與反轉單鏈表java相關的資料

熱點內容
機明自動編程軟體源碼 瀏覽:325
php埠號設置 瀏覽:540
phperegreplace 瀏覽:319
androidgridview翻頁 瀏覽:537
ssh協議編程 瀏覽:634
如何開我的世界電腦伺服器地址 瀏覽:861
玄關pdf 瀏覽:609
程序員學習論壇 瀏覽:940
程序員的毒雞湯怎麼做 瀏覽:547
安卓怎麼降級軟體到手機 瀏覽:281
雲與伺服器入門書籍推薦產品 瀏覽:636
delphi編程助手 瀏覽:761
電腦遇到伺服器問題怎麼辦 瀏覽:515
加工中心編程結束方法 瀏覽:295
了解什麼是web伺服器 瀏覽:139
面向對象的編程的基本特徵 瀏覽:718
php定時執行任務linux 瀏覽:787
php數組中刪除元素 瀏覽:724
螢石雲伺服器視頻 瀏覽:269
防火牆配置伺服器熱備的虛擬地址 瀏覽:189