Java实现LeetCode题目(链表)

Leetcode203去除链表元素

package link_list;
public class removePoint {
	//无虚拟结点的方法,注意不能操作空指针
	public static ListNode removeElement(ListNode head,int target) {
		while(head!=null&&head.val==target) { //判断头结点是不是为空 为什么是while[1,1,1,1]
			head = head.next;
		}
		ListNode cur = head;
		while(cur!=null&&cur.next!=null) {
			if(cur.next.val==target) {
				cur.next=cur.next.next;
			}else {
				cur = cur.next;
			}
		}
		return head;
	}
	
	//虚拟结点
	public static ListNode removeElement2(ListNode head,int target) {
		if(head==null) {
			return head;
		}
		ListNode demmyHead = new ListNode(-1,head);
		ListNode cur = demmyHead;
		while(cur.next!=null) {
			if(cur.next.val==target) {
				cur.next=cur.next.next;
			}else {
				cur=cur.next;
			}
		}
		head = demmyHead.next;
		return head;
		
		
	}

}

Leetcode707设计链表

使用Java设计一个链表

package link_list;



public class Design_Link {
	public static void main(String[] args) {
		Design_Link demo = new Design_Link();
		
		Design_Link.myLinkedList myLink = new Design_Link().new myLinkedList();
		myLink.addHead(0);
		myLink.addIndex(1,1);
		myLink.addTail(2);
		myLink.addTail(2);
		myLink.printVal();
		myLink.get(1);
		
	}
	class ListNode{
		int val;
		ListNode next;
		public ListNode() {
			
		}
		public ListNode(int val) {
			this.val=val;
		}
		public ListNode(int val,ListNode linkNode) {
			this.val=val;
			this.next = linkNode;
		}
	}
	class myLinkedList{
		//记录链表大小
		int size;
		//虚拟头结点
		ListNode head;
		public myLinkedList(){
			size = 0;
			head = new ListNode(0,null); 
		}
		//获取第index个结点的数值,注意index是从0开始的,第0个结点就是头结点。
		public void get(int index) {
			if(index<0||index>=size) {
				System.out.print("格式错误");
			}
			ListNode cur = head;
			//包含虚拟结点,所以查找第index+1个结点
			for(int i =0;i<=index;i++) {
				cur = cur.next;
			}
			System.out.println(cur.val);		
		}
		// 在第 index 个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
	    // 如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点
	    // 如果 index 大于链表的长度,则返回空
		public void addIndex(int index,int val) {
			if(index<0) {
				index = 0;
			}else if(index>size) {
				return;
			}
			size++;
			//找到要插入的结点前驱动
			ListNode pred = head;
			for(int i =0;i<index;i++) {
				pred = pred.next;
			}
			ListNode curAdd = new ListNode(val);
			curAdd.next = pred.next;
			pred.next= curAdd;
		}
		//插入最前面的节点,等价于在第0个元素添加
		public void addHead(int val) {
			addIndex(0,val);
		}
		//最后插入
		public void addTail(int val) {
			addIndex(size,val);
		}
		
		//删除第index个元素
		public void deleteIndex(int index) {
			if(index <0||index>=size) {
				return;
			}
			size--;
			ListNode pred = head;
			for(int i =0;i<index;i++) {
				pred = pred.next;
			}
			pred.next = pred.next.next;
		}
		public void printVal() {
			ListNode cur = head.next;
			if(cur!=null) {
				for(int i=0;i<size;i++) {
					System.out.print(cur.val+"\t");
					cur = cur.next;
				}
			}else {
				System.out.println("链表为空");
			}
			
		}
	}
}

LeetCode206反转链表

package link_list;
public class Revert_Link {
	public ListNode revertLink(ListNode head) {
		ListNode pre = new ListNode();
		ListNode cur = head.next;
		ListNode temp = new ListNode();
		while(temp!=null){
			temp = cur.next;
			cur.next = pre;
			pre = cur;
			cur=temp;
		}
		return pre;
	}
}

Leetcode19删除链表倒数第n个元素

package link_list;

public class Remove_Last {
	public ListNode  removeNthFromEnd(ListNode head,int n) {
		ListNode demmyHead = new ListNode(0);
		demmyHead.next=head;
		ListNode fast = demmyHead;
		ListNode slow = demmyHead;
		for(int i=0;i<=n;i++) {
			fast = fast.next;
		}
		while(fast!=null) {
			fast = fast.next;
			slow =slow.next;
		}
		slow.next = slow.next.next;
		return demmyHead.next;
	}
}

Leetcode160链表相交

package link_list;

public final class Link_Intersection {
	 public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
		 	//指针相等
			ListNode curA = headA;
			ListNode curB = headB;
			int lenA = 0;
			int lenB = 0;
			while(curA.next!=null) {
				lenA++;
				curA = curA.next; 
			}
			while(curB.next!=null) {
				lenB++;
				curB = curB.next;
			}
			curA=headA;
			curB=headB;
			//让curA指向最长的链表
			if(lenB>lenA) {
				int lenTemp = lenA;
				lenA = lenB;
				lenB = lenTemp;
				
				ListNode tempNode = curA;
				curA = curB;
				curB =tempNode;
			}
			int gap = lenA-lenB;
			while(gap--!=0) {
				curA = curA.next;
			}
			while(curA!=null){
				if(curA==curB) {
					return curA;
				}else {
					curA = curA.next;
					curB = curB.next;
				}
			}
			return null;

	    }
}

Leetcode 142环形链表II

package link_list;

public class Loop_Link {
	public ListNode findWay(ListNode head) {
		ListNode fast = head;
		ListNode slow = head;//有环的话快慢指针必定相遇
		//两个数一个环的情况得到循环条件,
		while(fast!=null&&fast.next!=null) {
			fast = fast.next.next;
			slow = slow.next;
			if(fast == slow) {
				ListNode index1 = head;
				ListNode index2 = fast;
				while(index1!=index2) {
					index1=index1.next;
					index2=index2.next;
				}
				return index2;
			}
		}
		return null;
	}
}