假設鍊錶節點的資料結構為:
struct node
;建立單鏈表的程式為:
struct node* create(unsigned int n)
node* p = head;
for (unsigned int i = 1; i < n; i++)
return head;
} 問題1:鍊錶逆置
思想為:head指標不斷後移,指標反向即可,**為:
void reverse(node*& head)
head->next = p;
}return;
}問題2:刪除不知頭結點鍊錶的某個節點
如果單向鍊錶不知道頭節點,乙個指標指向其中的乙個節點,問如何刪除這個指標指向的節點?
思想為:把這個節點的下乙個節點的值複製給該節點,然後刪除下乙個節點即可。
問題3:怎麼判斷鍊錶中是否有環?
思想為:設定兩個指標,乙個步長為1,另乙個步長為2,依次後移,如果相遇且都不為空,則有環。
與這個類似的問題包括:怎麼快速檢測出乙個巨大的鍊錶中的死鏈?或者如何找出乙個單鏈表的中間節點?
**為:
bool loop(node* head)
node* one = head;
node* two = head->next;
if (two == null)
while (one != two)
if (two != null)
if (two == null)
two = two->next;
if (one == null || two == null)
}if (one == null || two == null)
return flag;
}問題4:如果乙個單向鍊錶,其中有環,怎麼找出這個鍊錶迴圈部分的第乙個節點?
思想為:假設該節點在x位置處,假設步長為1的指標和步長為2的指標相遇在x+z處,迴圈的長度為y,那麼2(x+z)-(x+z)=k*y,
那麼當乙個指標再從開始出後移時,另乙個指標從相遇點開始後移時,這兩個指標就會在迴圈開始處相遇。
**為:
node* findloopplace(node* head, unsigned int* place = null)
node* one = head;
node* two = head->next;
unsigned int count = 1;
while (one != two)
one = head;
while (one != two)
two = two->next;
count++;
}*place = count;
return one;
}問題5:如何查詢鍊錶中倒數第k個節點?
思想為:兩個指向頭結點的指標,乙個先向後移動k位,然後兩個同時向後面移動直到乙個節點到達鏈尾,前面乙個指標的位置就是了。
node* findlastk(node* head,unsigned int k)
if (count < k)
p = head;
node* q = head;
for (unsigned int i = 0; i < k; i++)
while (p != null)
return q;
}問題6:程式設計序判斷兩個鍊錶是否相交。
這個問題的精彩解說請參見《程式設計之美》一書之《程式設計判斷兩個鍊錶是否相交》,這裡就不寫了,該書的pdf文件在網上很好下。
文章後面給了兩個擴充套件問題:
(1)如果鍊錶可能有環,如何做判斷?
思想為:首先應該明白,只有乙個鍊錶有環的情況下是不會相交的,只有都有環或者都沒有環的情況下才可能相交,都沒有環的情況下最簡便的方法就是判斷鏈尾是否相交即可;都有環的情況下,分別找到環上的任一點,乙個不動,另乙個步進,即可判斷是否相交。
(2)如何求相交鍊錶的第乙個節點?應該為單鏈表情況
思想為:方法一是先把任乙個鍊錶連成環,即從表尾接到表頭,按照問題4的解法;方法二是計算兩個鍊錶的長度,而兩個鍊錶是按照尾部對齊的,那麼從短鍊錶的第乙個位置從長鍊錶的第長度差+1的位置依次比較指標值,相等的位置即是。
相關程式包括:單鏈表中在某個位置插入環以及銷毀鍊錶等,**如下:
void insertcircle(node* head, unsigned int n)
if (n <= count)
p->next = q;
}return;
}void destroy(node* head)
head = head->next;
q->next = null;
destroy(head);
}else}}
linux 鍊錶及相關鍊錶操作
1.鍊錶結構體 struct list head2.list entry define container of ptr,type,member container of ptr,type,member ptr為list head指標,type為包含list head結構體物件型別,member為鍊...
鍊錶的相關操作
連線兩個迴圈單鏈表 p a next 儲存a表的頭結點位置 a next b next next b的開始結點鏈結到a表尾 free b next b next p return b 注 a,b為已構建好的迴圈鍊錶,具有尾指標 鍊錶中的環附 include include struct node s...
反向列印鍊錶
方法一 翻轉鍊錶,順序輸出鍊錶中的元素 缺點改變了原來鍊錶的結果 方法二 使用棧 這種先進後出的資料結構,缺點使用額外的資料結構 方法三 遞迴 方法的遞迴就是棧 static listlist new arraylist public static void main string args 遞迴實...