一、链表结构
package list1;
/**
* Created with IntelliJ IDEA.
*
* @author : Future master
* @version : 1.0
* @Project : Java算法联系
* @Package : list1
* @ClassName : ListNode.java
* @createTime : 2021/11/2 21:42
* @Email : 2467636181@qq.com
*/
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
二、返回链表的中间节点
package list1;
/**
* Created with IntelliJ IDEA.
*
* @author : Future master
* @version : 1.0
* @Project : Java算法联系
* @Package : list1
* @ClassName : ListOne.java
* @createTime : 2021/11/2 21:40
* @Email : 2467636181@qq.com
* 给定一个头结点为 head 的非空单链表,返回链表的中间结点。
*
* 如果有两个中间结点,则返回第二个中间结点。
*/
public class ListOne {
public ListNode middleNode(ListNode head) {//双指针操作,
ListNode node1 = head;//一个用来记录到结尾的节点
ListNode node2 = head;//一个用来记录到中间的节点
boolean flag = true;//两次执行一次对中间节点的移动
while(node1.next!=null){//当这一节点还存在下一节点的时候执行循环语句
if(!flag){
flag = true;//当标志位false的时候第二个节点不动
}else{
flag = false;//当标志位true的时候第二节点进行+1
node2 = node2.next;
}
node1 = node1.next;//节点一一直同步进行移动
}
return node2;//最后返回节点二
}
public static void main(String[] args) {
ListNode listNode = new ListNode(0);
ListNode listNode1 = listNode;
for (int i = 1;i<10;i++){
listNode.next = new ListNode(i);
listNode = listNode.next;
}
ListOne listOne = new ListOne();
ListNode result = listOne.middleNode(listNode1);
System.out.println(result.val);
}
}
三、给你一个链表删除倒数第n个节点,范湖链表的头结点
package list1;
/**
* Created with IntelliJ IDEA.
*
* @author : Future master
* @version : 1.0
* @Project : Java算法联系
* @Package : list1
* @ClassName : ListTwo.java
* @createTime : 2021/11/2 22:51
* @Email : 2467636181@qq.com
* 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
*
* 进阶:你能尝试使用一趟扫描实现吗?
*/
public class ListTwo {
public ListNode removeNthFromEnd(ListNode head, int n) {//双指针操作
ListNode node1 = head;
ListNode node2 = head;
while(n--!=0){
node1 = node1.next;
}
if(node1==null){// 如果快指针走到了最后说明删除的是第一个节点,就返回head.next就好
return head.next;
}
node1 = node1.next;// 使得slow每次都是在待删除的前一个节点, 所以要先让fast先走一步
while(node1 != null) {
node1 = node1.next;
node2 = node2.next;
}
node2.next = node2.next.next;// 因为已经保证了是待删除节点的前一个节点, 直接删除即可
return head;
}
public static void main(String[] args) {
ListNode listNode1 = new ListNode(0);
ListNode listNode2 = listNode1;
for(int i =1;i<6;i++){
listNode1.next = new ListNode(i);
listNode1 = listNode1.next;
}
ListTwo listTwo = new ListTwo();
ListNode result = listTwo.removeNthFromEnd(listNode2,2);
System.out.println(result.val);
}
}