题目:
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
思路:
(一)分四种情况,效率较低 用数组
将数据放入List 集合 进行判断
1 list 只有一条数据,直接让头指针指向空
2 删除数据为 倒数第一个 , 就让倒数第一个node 的 前一个 node.next = null
3 删除数据为 倒数最后一个 就让返回的头指针 指向head.next;
4 剩下的就是 求出要删除的前一个node 指向 要删除的node 的下一个node
(二)双指针
保存一份头指针 temphead
1 先遍历一遍 如果n == 节点数量 ,就返回 temphead = temphead.next;
2 如果不相等,则再从头开始遍历到删除节点前的那个节点,让他head.next = head.next.next 返回存储的头指针
(一) 代码 暴力 枚举
class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { if(head == null){ return head; } //保存头指针 ListNode temphead = head; //存储list List<ListNode> list = new ArrayList<>(); while(head != null){ list.add(head); head = head.next; } //分四种情况 效率较低 //1 只有一条数据,直接返回空 //2 删除数据为 倒数第一个,就让倒数第一个的node 的 前一个node.next = null //3 删除数据为 倒数最后一个,就让返回的头指针 指向head.next //4 省下的就是 求出要删除的前一个node 指向 要删除的node 的下一个node if(list.size() == 1){ temphead = null; }else if(n == 1){ ListNode prenode = list.get(list.size() - 2); prenode.next = null; }else if(list.size() == n){ temphead = temphead.next; }else{ ListNode prenode = list.get(list.size() - n - 1); ListNode nextnode = list.get(list.size() - n + 1); prenode.next = nextnode; } return temphead; } }
(二) 双指针
class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { if(head == null){ return head; } //保存头指针 ListNode temphead = head; int count = 0; while(head != null){ count++; head = head.next; } if(count == n){ return temphead.next; } //倒数,改成正数第几个 n = count - n; count = 1; //注意这里,从一开始 head = temphead; while(head != null){ if(count == n){ //让下一个 指向下下一个 head.next = head.next.next; //返回头指针 return temphead; }else{ //向后移动指针 count++; head = head.next; } } return temphead; } }
JVM