单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)
前沿:鏈表是面試中經常問道的知識點,比如鏈表反轉,就地反轉,判斷單鏈表是否相交,判斷鏈表是否有環等都是常問的問題.今天說一下單鏈表就地反轉.
本文從包含頭節點和不包含頭節點兩種鏈表都提供了相應的就地反轉方案:
頭節點:數據結構中,在單鏈表的開始結點之前附設一個類型相同的結點,稱之為頭結點。頭結點的數據域可以不存儲任何信息,頭結點的指針域存儲指向開始結點的指針(即第一個元素結點的存儲位置)。
作用: 是為了方便單鏈表的特殊操作,比如插入,刪除等操作在鏈表在鏈表為null時操作具有特殊性.而使用了頭節點后就保持了單鏈表操作的統一性!
包含頭節點實現就地反轉
思路:1.如果頭節點為空,或者只有頭節點或者只有頭節點以及一個后繼節點.這不需要反轉,
2.如果有兩個以上的節點通過一個cur指針指向二個節點,并將第一個節點的next指向null
3.如果cur節點不為null,通過另一個temp指針指向cur節點的的next節點,(由于后面cur節點的next需要變化所以先保存下來)
4.將cur節點的next指向當前的第一個節點(也就是head的next節點)
5.將head節點的next節點指向cur節點.
6.設置cur節點為temp節點.從3開始循環
public static void reverse(Node head){
//步驟1
if (head==null||head.next==null||head.next.next==null){
return;
}
//步驟2
Node cur=head.next.next;
head.next.next=null;
while (cur!=null){
//步驟3
Node temp=cur.next;
//步驟4
cur.next=head.next;
//步驟5
head.next=cur;
//步驟6
cur=temp;
}
}
關于以上的主要思想其實就是:
當除了頭節點外,沒有其他節點或者只有一個節點時,鏈表不需要反轉.
通過三個指針輔助執行整個反轉過程,head用于指向頭節點,cur指向當前節點,temp用于指向cur的next節點.
將第一個節點(非head)的next指向null,因為在反轉之后它為最后一個節點
將cur節點不斷的插入到head和第一個節點之間,并將cur指針指向temp不斷推進.
不包含頭節點實現就地反轉
private static Node revert(Node head) {
if (head == null || head.nextNode == null) {
// 到達尾結點
return head;
}
// 一直入棧
Node revertHead = revert(head.nextNode);
// 出棧并賦值nextNode對象
head.nextNode.nextNode = head;
head.nextNode = null;
// 返回尾結點(逆置后的頭結點)
return revertHead;
}
1.通過遞歸的方式找到尾節點(也就是反轉后的頭節點)
2.從文件尾節點開始反向遍歷,每次都將自己的下一個節點指向自己,并將字節的next指向null.
總結
以上是生活随笔為你收集整理的单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java数组的调用_java中数组的应用
- 下一篇: java txt 写入_JAVA 写入T