解題思路:
兩煉表若相交,則其最後乙個節點必定相同。所以遍歷得出兩鍊錶的尾節點可得知兩鍊錶是否相交。
若兩鍊錶相交,則求出兩鍊錶長度,相減得其差值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...