一、
给定一个头结点为 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
/**
* Definition for singly-linked list.
* 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; }
* }
*/
class Solution {
// 链表不能通过下标的方式来进行访问,所以可以将链表存储到数组中来查找序号
// 存储为数组之后,找到中间元素的下标即可
public ListNode middleNode(ListNode head) {
ListNode[] t = new ListNode[100];
int i = 0;
while(head != null){
t[i++] = head;
head = head.next;
}
return t[i/2];
}
}
二、
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
/**
* Definition for singly-linked list.
* 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; }
* }
*/
// 返回链表的头节点,可以选择先把头节点存储起来,最后直接返回
// 删除链表的倒数第n个节点,即找到第length-n+1位置,并且删除该位置的下一个节点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode t = new ListNode(0,head);
int len = length(head);
// 因为要返回头节点,所以不能让头节点发生改变
ListNode cur = t;
for(int i = 0;i < len-n;++i){
cur = cur.next;
}
cur.next = cur.next.next;
ListNode ll = t.next;
return ll;
}
public int length(ListNode head){
int count = 0;
while(head != null){
++count;
head = head.next;
}
return count;
}
}