如下为链接节点,后续都用此表示链接节点
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;
}