面試中煉表的常見5中操作

2021-09-02 01:20:37 字數 3011 閱讀 7305

我的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...