五個常見鍊錶操作

2022-07-02 06:51:11 字數 1669 閱讀 2760

package cn.wangbo.list;

/** 這是鍊錶類,

* 封裝了鍊錶節點資訊

* */

public class node

public node(t val, node next)

}

單鏈表反轉,只需要將每個結點的next指標指向其前驅結點。這個過程中,為了避免斷鏈,我們需要新建三個結點記錄當前結點、當前結點的前驅結點、當前結點的下一結點

nodeprenode = new node();

nodecurnode = list;//list是煉表頭指標

nodenextnode = new node();

//反轉指標

while (curnode.next != null)

curnode.next = prenode;

這裡可以採用快慢指標法。快指標每次走兩步、慢指標每次走一步。如果快慢指標相遇,則說明有環,否則如果快指標走到終點(null)則說明無環。

public static boolean ringtest(node node)

node slownode = node;

node fastnode = node.next;

while (fastnode.next != null && fastnode != null)else if (fastnode == slownode)

}return false;

}

兩個有序鍊錶合併思路並不複雜,但是千萬要注意最後不要忘記指向剩下沒有指向過的結點。

static node merge(nodenode1,nodenode2)else

node = node.next;

}if (node1 == null)

else if (node2 == null)

return pnode.next;

}

如果採用兩次遍歷的話自然非常簡單,但是如果要求只遍歷一次怎麼做呢?首先用兩個指標指向head結點,把第乙個指標指向第n個結點,然後同時將兩個指標往後一步步移動,當第乙個指標的next指向null的時候,第二個指標指向第倒數n-1個結點,snode.next = snode.next.next即完成刪除

public static nodedelete(nodehead,int n)

//如果鍊錶長度為n

if (fnode == null)

while (fnode.next != null)

snode.next = snode.next.next;

return head;

}

這裡同樣是採用快慢指標法。快指標每次走兩步,慢指標每次走一步,當快指標走完整個鍊錶的時候,慢指標剛好走到鍊錶的中間節點

public static nodegetmid(nodenode)

return slownode;

}

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