19. 删除链表的倒数第N个节点


给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

思路:

定义三个指针,

p扫描整个链表,定位到最后一个元素

q定位  倒数第n个元素

node  第n-1个元素

 

如上图,删除q结点使用   node.next = q.next

假设n == 5,那q = head     node = null

删除q结点用    head = head.next

 

最后返回head

代码:

 1 public ListNode removeNthFromEnd(ListNode head, int n) {
 2         ListNode p = head;//后指针
 3         ListNode q = head;//前指针
 4         ListNode node = null;
 5         int target = 1;
 6         while(target < n ) {
 7             p = p.next;
 8             target++;
 9         }
10         while(p!= null && p.next!=null) {
11             p = p.next;
12             node = q;
13             q = q.next;
14         }
15         if(node != null) {
16             node.next = q.next;
17         }
18         else {
19             head = head.next;
20         }
21         return head;
22     }

 

 实现一次扫描

 

posted @ 2018-11-20 23:30  dafeifeifei  阅读(92)  评论(0编辑  收藏  举报