Java中連結串列相關演算法
阿新 • • 發佈:2019-02-12
如下為連結節點,後續都用此表示連結節點
class ListNode{
int value;
ListNode next;
public ListNode(int value,ListNode next){
}
}
1、連結串列的反轉方法
/***
* 迴圈方法實現連結串列反轉
* @param head
* @return
*/
public ListNode reverseListNodeWithIterative(ListNode head){
if (head ==null || head.next==null){
return head;
}
ListNode pre = null;
ListNode cur = head;
while(cur!=null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
/***
* 遞迴方法實現連結串列反轉
* @param head
* @return
*/
public ListNode reverseListNodeWithRecursive(ListNode head){
if(head==null || head.next==null){
return head;
}
ListNode nextNode = head.next;
ListNode newHead = reverseListNodeWithRecursive(head);
nextNode.next = head;
head.next = null ;
return newHead;
}
2.找出連結串列的中間節點
/***
* 尋找連結串列的中間節點
* @param head
* @return
*/
public ListNode findMiddleNode(ListNode head){
if(head==null){
return head;
}
ListNode slow = head,fast = head;
if(fast.next!=null && fast.next.next!=null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
3.用快慢指標判斷連結串列是否有環
/***
* 用快慢指標判斷連結串列是否有環
* @param head
* @return
*/
public boolean isCircleLinkedListNode(ListNode head){
if(head == null){
return false;
}
ListNode slow = head,fast = head;
if(fast.next !=null && fast.next.next!=null){
slow =slow.next;
fast = fast.next.next;
if(slow == fast){
return true;
}
}
return false;
}
4.將某個元素插入排序連結串列中
/***
* 將某個元素插入排序連結串列中
* @param head
* @param target
* @return
*/
public ListNode insetNode(ListNode head,int target){
ListNode targetNode = new ListNode(target,null);
if(head == null || target<=head.value){
targetNode.next = head;
return targetNode;
}
ListNode cur = head;
while(cur!=null){
if(cur.next ==null || target>=cur.next.value){
targetNode.next = cur.next;
cur.next = targetNode;
}
cur = cur.next;
}
return head;
}