《Cracking the Coding Interview》——第2章:链表——题目2

2014-03-18 02:24

题目:给定一个单链表,找出倒数第K个节点。

解法:让一个指针先走K步,然后俩指针一起走到尽头。当然也可以先走到尽头数出链表的长度,然后第二次少走K步。其实耗费的工夫是一样的,但貌似总有人觉得第一种方法很巧妙很优美。

代码:

 1 // 2.2 Remove a node from middle of a linked list

 2 #include <cstdio>

 3 using namespace std;

 4 

 5 struct ListNode {

 6     int val;

 7     struct ListNode *next;

 8     ListNode(int x): val(x), next(nullptr) {};

 9 };

10 

11 class Solution {

12 public:

13     ListNode* findKthNode(ListNode *head, int k) {

14         if (head == nullptr || k < 1) {

15             return head;

16         }

17         struct ListNode *p1, *p2;

18         

19         p1 = p2 = head;

20         int i;

21         for (i = 0; i < k; ++i) {

22             p2 = p2->next;

23             if (p2 == nullptr) {

24                 return head;

25             }

26         }

27         while (p2 != nullptr) {

28             p1 = p1->next;

29             p2 = p2->next;

30         }

31         

32         return p1;

33     }

34 };

35 

36 int main()

37 {

38     int i;

39     int n, k;

40     int val;

41     struct ListNode *head, *ptr;

42     Solution sol;

43     

44     while (scanf("%d", &n) == 1 && n > 0) {

45         // create a linked list

46         ptr = head = nullptr;

47         for (i = 0; i < n; ++i) {

48             scanf("%d", &val);

49             if (head == nullptr) {

50                 head = ptr = new ListNode(val);

51             } else {

52                 ptr->next = new ListNode(val);

53                 ptr = ptr->next;

54             }

55         }

56         

57         // find the kth node from the end of the list

58         scanf("%d", &k);

59         ptr = sol.findKthNode(head, k);

60         printf("%d\n", ptr->val);

61         

62         /*

63         // print the list

64         printf("%d", head->val);

65         ptr = head->next;

66         while (ptr != nullptr) {

67             printf("->%d", ptr->val);

68             ptr = ptr->next;

69         }

70         printf("\n");

71         */

72         

73         // delete the list

74         while (head != nullptr) {

75             ptr = head->next;

76             delete head;

77             head = ptr;

78         }

79     }

80     

81     return 0;

82 }

 

你可能感兴趣的:(interview)