Java兩種方式實現連結串列的刪除,返回頭結點

weixin_45986454發表於2020-09-27

標題:Java兩種方式實現連結串列的刪除,返回頭結點

Java兩種方式實現連結串列的刪除,返回頭結點。

方式一:分是否是刪除第一個節點

public ListNode del(ListNode head,int n) {
		//head==null
		if(head==null) {
			return head;
		}
		if(n<1) {
			return null;//輸入不合法
		}
		//head  1   //若是再生成一個指標放在前面,則不需要分 1 和 n
		if(n==1) {
			return head.next;
		}
		//head  n
		int count=1;
		ListNode p=head;
		ListNode s=head;
		while(count<n && p!=null) {
			s=p;
			p=p.next;
			count++;
		}
		if(p!=null) {
			s.next=p.next;
		}
		return head;
	}

方式二:生成一個新的節點,放在head的前面,使得不需要分是否刪除第一個節點head

public ListNode del02(ListNode head,int n) {
		//head==null
		if(head==null) {
			return head;
		}
		if(n<1) {
			return null;//輸入不合法
		}
		
		ListNode newHead=new ListNode(-1);
		newHead.next=head;
		int count=1;
		ListNode p=head;
		ListNode s=newHead;
		while(count<n && p!=null) {
			s=p;
			p=p.next;
			count++;
		}
		if(p!=null) {
			s.next=p.next;
		}
		return newHead.next;
	}

完整程式碼如下:

/**
 * 兩種方式實現連結串列的刪除
 * @author dell
 *
 */
public class GiveLinkAndArrToDel {
	/**
	 * 連結串列的刪除
	 * @param head
	 * @param n
	 * @return
	 */	
	public ListNode del(ListNode head,int n) {
		//head==null
		if(head==null) {
			return head;
		}
		if(n<1) {
			return null;//輸入不合法
		}
		//head  1   //若是再生成一個指標放在前面,則不需要分 1 和 n
		if(n==1) {
			return head.next;
		}
		//head  n
		int count=1;
		ListNode p=head;
		ListNode s=head;
		while(count<n && p!=null) {
			s=p;
			p=p.next;
			count++;
		}
		if(p!=null) {
			s.next=p.next;
		}
		return head;
	}

	/**
	 * 刪除,新生成一個節點
	 * @param head
	 * @param n
	 * @return
	 */
	public ListNode del02(ListNode head,int n) {
		//head==null
		if(head==null) {
			return head;
		}
		if(n<1) {
			return null;//輸入不合法
		}
		
		ListNode newHead=new ListNode(-1);
		newHead.next=head;
		int count=1;
		ListNode p=head;
		ListNode s=newHead;
		while(count<n && p!=null) {
			s=p;
			p=p.next;
			count++;
		}
		if(p!=null) {
			s.next=p.next;
		}
		return newHead.next;
	}
	public void printAll(ListNode head) {
		if(head==null) {
			return ;
		}else {
			System.out.print(head.val+" ");
			this.printAll(head.next);
		}
	}
	
	@Test
	public void test() {
		ListNode a1 = new ListNode(1);
		ListNode a2 = new ListNode(2);
		ListNode a3 = new ListNode(4);
		ListNode a4 = new ListNode(5);
		ListNode a5 = new ListNode(6);
		
		a1.next=a2;
		a2.next=a3;
		a3.next=a4;
		a4.next=a5;
		
		System.out.println("輸出所有節點");
		this.printAll(a1);
		
		int n=1;
		ListNode del = this.del02(a1, n);
		System.out.println("\n刪除後");
		this.printAll(del);
	}
	
}

相關文章