我的csdn:
我的github:
我的個人部落格:
public node inverselinklist(node head)
return pre_node;
}
/**
* 檢測鍊錶中的環形: 快慢指標法
* 首先設定兩個指標,分別命名為fast和slow,fast指標每次向後移2步,slow指標每次向後移1步。如果,fast指標最後走到尾結點,則沒有環。如果,fast指標和slow指標相遇,則證明有環。
* 環的起始結點的查詢: 當fast與slow相遇之後,fast指標從頭結點開始走,每次走1步,當fast再次與slow相遇以後,相遇處的結點為環的入口結點
** @param head 待檢測的鍊錶
* @return 環結點的入口, null表示無環結點
*/public node checklinkring_v1(final node head)
node fast_node = head;
node slow_node = head;
int count = 0;//相遇的次數
while (fast_node != null && slow_node != null)
if (ringin_node == null) else
fast_node = fast_node.next;
}slow_node = slow_node.next;
if (fast_node == slow_node) }}
return ringin_node;
}/**
* 足跡法: 順序遍歷鍊錶中所有的節點,並將所有遍歷過的節點資訊儲存下來。如果某個節點的資訊出現了兩次,則存在環。
* @param head
* @return
*/public boolean checklinkring_v2(final node head)
map.put(p, p);
p = p.next;
}return result;
}
/**
* 通過比較,每次只拷貝小的資料到合併後的鍊錶中,原有鍊錶結構不會被破壞
** @param h1
* @param h2
* @return 合併後的鍊錶的頭
*/public static node mergeorderlylink_v1(final node h1, final node h2)
node merge = null;
node p1 = h1, p2 = h2;
node pm = new node(-1, null);//自定義乙個頭結點
int i = 0;
while (p1 != null && p2 != null) else
if (i == 0)
pm = pm.next;
i++;
}tem = p1 == null ? p2 : p1;
while (tem != null)
merge = merge.next;//去除自定義的頭結點
return merge;
}/**
* 遞迴合併有序鍊錶,原有鍊錶結構會被破壞,資料較大時容易發生堆疊溢位異常,
** @param h1
* @param h2
* @return
*/public static node mergeorderlylink_v2(final node h1, final node h2)
node merge = null;
if (h1.data <= h2.data) else
return merge;
}
/**
* 一次遍曆法: 使用快慢指標。快指標比慢指標提前n個單元。當快指標到達單鏈表尾部時,慢指標指向待刪除節點的前節點。
** @param head
* @param beforindex 保證有效,從 1 開始
* @return
*/public static node deleteindexformend_v2(final node head, int beforindex)
if (fast == null)
while (fast.next != null)
slow.next = slow.next.next;
return head;
}/**
* 常規做法: 遍歷第一次求出鍊錶的長度,遍歷第二次刪除
** @param head
* @param beforindex 保證有效,從 1 開始
* @return
*/public static node deleteindexformend_v1(final node head, int beforindex)
if (beforindex == size)
int count = 0;
int k = size - beforindex;
p = head;//復位
node pre = p; //記錄要尋找到的刪除的結點的上結點
while (p != null)
pre = p;
p = p.next;
count++;
}return head;
}
/**
* 尋找鍊錶的中間結點: 設定兩個指標,乙個快指標,每次走兩步,乙個慢指標,每次走一步。
* 常規做法: 先遍歷整個鍊錶求長度在遍歷一次找到中間結點,**省略
** @param head
* @return
*/public static node findcenternode(node head)
return slow;
}
5個常見的鍊錶操作
時間複雜度 o n 空間複雜度 o 1 listnode reverselist listnode head return temp public static node reverse node list currnode.next prenode prenode currnode currnod...
5個常見的鍊錶操作
1.單鏈表反轉 leetcode對應題目 比較適合用頭插法,大致思路就是 首先判斷這個引數是不是null,如果是的話,那就直接返回null,如果不是的話,開始正常操作 建立三個新的結點,其中乙個當做新的頭結點,乙個指向原來的頭結點,另乙個起輔助作用。然後開始遍歷,在原來結點還存在的情況之下,開始不斷...
鍊錶的常見操作
include include includeusing namespace std typedef struct nodetype node typedef struct dnodetype dnode 建立單鏈表 node createlist node head node current he...