查找和删除倒数第n个节点的问题

 1 class ListNode
 2 {
 3     int val;
 4     ListNode next;
 5     ListNode(int x)
 6     {
 7         val = x;
 8     }
 9 }
10 public class NthNodeFromEnd {
11      public ListNode removeNthFromEnd(ListNode head, int n) 
12      {
13          ListNode p = head;
14          ListNode q = head;
15          for(int i = 0; i < n ; i++)
16          {
17              p = p.next;
18          }
19          if(p == null)//如果p==null,说明倒数第n个就是第一个节点,即头结点。
20          {
21              head = head.next;
22              return head;
23          }
24          while(p.next != null)
25          {
26              p = p.next;
27              q = q.next;
28          }
29          if(q.next != null)
30          {
31              q.next = q.next.next;
32          }
33          
34          return head;
35      }
36      public ListNode removeNthFromEnd2(ListNode head, int n) 
37      {
38         //因为要删掉倒数第n个节点,那就必须找到倒数第n+1个节点
39         //如果倒数第n正好是头结点,那么头结点前面没有节点了很麻烦,我们可以设置一个节点作为头结点之前的节点
40         //设置一个头结点,这样就不用单独对原始头结点处理了
41          ListNode dumy = new ListNode(0);
42          dumy.next = head;
43          ListNode p = dumy;
44          ListNode q = dumy;
45          for(int i = 0; i < n; i ++)
46          {
47              p = p.next;
48          }
49          while(p.next!=null)
50          {
51              p = p.next;
52              q = q.next;
53          }
54          q.next = q.next.next;
55          return dumy.next;
56      }
57      //找倒数第n个节点
58      public ListNode findNthFromEnd(ListNode head, int n)
59      {
60          ListNode p = head;
61          ListNode q = head;
62          for(int i = 0; i < n-1; i ++)
63          {
64              p = p.next;
65          }
66          while(p.next!=null)
67          {
68              p = p.next;
69              q = q.next;
70          }
71          return q;
72      }
73      
74      public static void main(String[] args)
75      {
76          NthNodeFromEnd rn = new NthNodeFromEnd();
77          ListNode n1 = new ListNode(1);
78          ListNode n = rn.removeNthFromEnd(n1, 1);
79          System.out.println(rn.findNthFromEnd(n1, 1).val);
80          if(n == null)
81          {
82              System.out.println(n);
83          }
84          while(n!= null)
85          {
86              System.out.println(n.val);
87              n = n.next;
88          }
89      }
90 }
原文地址:https://www.cnblogs.com/masterlibin/p/5540562.html