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