資料結構 單鏈表相關習題3

2021-08-20 04:39:22 字數 2965 閱讀 6844

解題思路:

兩煉表若相交,則其最後乙個節點必定相同。所以遍歷得出兩鍊錶的尾節點可得知兩鍊錶是否相交。

若兩鍊錶相交,則求出兩鍊錶長度,相減得其差值len。

較長鍊錶先向後遍歷len次,隨後兩鍊錶同時向後遍歷。直到出現兩值相同時,該節點即為相交點。

//判定兩個鍊錶是否相交, 並求出交點 

linknode* hascross(linknode* head1, linknode* head2)

int len1 = 0,len2 = 0,len = 0;

linknode* cur1 = head1;

linknode* cur2 = head2;

while(cur1)

while(cur2)

if(len1 > len2)

}

else

}

while(head1 != head2)

return head1;

}

//測試函式

void testhascross()

執行結果:

可分為三種情況:

1.兩個不帶環鍊錶,上一題已經解決

2.乙個帶環,乙個不帶環

不可能相交

3.兩個帶環鍊錶,可分為以下兩種情況

兩帶環鍊錶是否相交判斷方法:

我們可以先分別求出兩環快慢指標的相遇點meet(快指標一次走2步,慢指標一次走1步)。

隨後用其中乙個meet點繞環一周,若能遇到另乙個meet點則兩鍊錶相交。

反之,兩鍊錶不相交。

int hascrosswithcycle(linknode* head1, linknode* head2)

int ret1 = hascycle(head1);

int ret2 = hascycle(head2);

if(ret1 == 0 && ret2 == 0)

else if(ret1 == 1 && ret2 == 1)

cur = cur->next;

} return 0;

} else

}

執行結果:

解題思路:

從頭節點開始,比較當前兩節點大小。

若相等,將該節的值點插入新鍊錶,兩鍊錶同時向後走一步。

若不相等,將較小值的鍊錶向後走一步。(因為是有序鍊錶,所以node1小於node2的話,node1一定小於node2後面的節點,不可能出現相等的情況。)

//求兩個有序鍊錶的交集,返回表示交集的新鍊錶

//小的值往後移,相等都往後移

linknode* unionset(linknode* head1, linknode* head2)

}

return newhead;

}//測試函式

//拷貝複雜鍊錶

typedef struct complexnode

complexnode;

complexnode* createcomplexnode(datatype data)

newnode->data = data;

newnode->next = null;

newnode->random = null;

return newnode;

}//列印複雜鍊錶

void complexnodeprint(complexnode* head,char* msg)

printf("\n[random]\n");

cur = head;

while(cur)

printf("[%c->%c] ",cur->data,cur->random->data);

cur = cur->next;

} printf("\n");

}//拷貝複雜鍊錶

complexnode* copycomplex(complexnode* head)

complexnode* cur = head;

//此迴圈,是將原煉表後每個節點插入新節點

while(cur)

cur = head;

complexnode* newnode = null;

//此迴圈,是給新插入的節點的隨機指標域賦值

while(cur)

cur = newnode->next;

} cur = head;

complexnode* newhead = cur->next;

complexnode* x = head;

//此迴圈,是將插入的節點從原鍊錶拆分下來,形成新鍊錶完成拷貝

while(cur->next)

return newhead;

}

測試函式:

void testcomplexnode()

執行結果:

單鏈表相關習題

設定乙個臨時變數來當作計數器。然後對整個鍊錶進行遍歷來數出有效節點的個數。public intgetlength length temp temp.next return length 也可以直接使用whil來判斷進行條件。public intgetlength return length 解決這個...

資料結構 單鏈表相關知識

1 建立乙個單鏈表 實現思路 首先,定義乙個頭結點 l 為其在記憶體中開闢一段空間並將指標域指標指向null 其次,生成乙個新結點p,將要插入的資料元素儲存到結點的資料域,並將其指標域指標指向頭結點 l 指向的結點 或null 最後,將新結點p插入到表頭。隨機產生n個元素的值,建立帶頭結點的單鏈線性...

Go語言 資料結構 單鏈表相關操作

一般來說,為了比較好的對單鏈表進行增刪該查操作,會設定乙個頭節點來標識煉表頭,這個節點本身不存放資料。如下 package main import fmt 定義乙個heronode type heronode struct 給鍊錶插入乙個結點,在單鏈表的最後加入 func insertheronod...