leetcode-19:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */
方法:两次遍历算法
思路
我们注意到这个问题可以容易地简化成另一个问题:删除从列表开头数起的第 (L - n + 1)(L−n+1) 个结点,其中 LL 是列表的长度。只要我们找到列表的长度 LL,这个问题就很容易解决。
算法
首先我们将添加一个哑结点作为辅助,该结点位于列表头部。哑结点用来简化某些极端情况,例如列表中只含有一个结点,或需要删除列表的头部。在第一次遍历中,我们找出列表的长度 LL。然后设置一个指向哑结点的指针,并移动它遍历列表,直至它到达第 (L - n)(L−n) 个结*
点那里。我们把第 (L - n)(L−n) 个结点的 next 指针重新链接至第 (L - n + 2)(L−n+2) 个结点,完成这个算法。
class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(0); dummy.next = head; int length = 0; ListNode first = head; while (first != null){ length++; first = first.next; } length = length-n; first = dummy; while (length > 0){ length--; first = first.next; } first.next = first.next.next; return dummy.next; } } // 以下为调试代码~~ public class MainClass { public static int[] stringToIntegerArray(String input) { input = input.trim(); input = input.substring(1, input.length() - 1); if (input.length() == 0) { return new int[0]; } String[] parts = input.split(","); int[] output = new int[parts.length]; for(int index = 0; index < parts.length; index++) { String part = parts[index].trim(); output[index] = Integer.parseInt(part); } return output; } public static ListNode stringToListNode(String input) { // Generate array from the input int[] nodeValues = stringToIntegerArray(input); // Now convert that list into linked list ListNode dummyRoot = new ListNode(0); ListNode ptr = dummyRoot; for(int item : nodeValues) { ptr.next = new ListNode(item); ptr = ptr.next; } return dummyRoot.next; } public static String listNodeToString(ListNode node) { if (node == null) { return "[]"; } String result = ""; while (node != null) { result += Integer.toString(node.val) + ", "; node = node.next; } return "[" + result.substring(0, result.length() - 2) + "]"; } public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = in.readLine()) != null) { ListNode head = stringToListNode(line); line = in.readLine(); int n = Integer.parseInt(line); ListNode ret = new Solution().removeNthFromEnd(head, n); String out = listNodeToString(ret); System.out.print(out); } } }
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def removeNthFromEnd(self, head, n): """ :type head: ListNode :type n: int :rtype: ListNode """ dummy = ListNode(0) dummy.next = head length = 0 first = head while first: length = length + 1 first = first.next length = length - n first = dummy while length: length = length -1 first = first.next first.next = first.next.next return dummy.next def stringToListNode(input): # Generate list from the input numbers = json.loads(input) # Now convert that list into linked list dummyRoot = ListNode(0) ptr = dummyRoot for number in numbers: ptr.next = ListNode(number) ptr = ptr.next ptr = dummyRoot.next return ptr def stringToInt(input): return int(input) def listNodeToString(node): if not node: return "[]" result = "" while node: result += str(node.val) + ", " node = node.next return "[" + result[:-2] + "]" def main(): import sys def readlines(): for line in sys.stdin: yield line.strip('\n') lines = readlines() while True: try: line = lines.next() head = stringToListNode(line) line = lines.next() n = stringToInt(line) ret = Solution().removeNthFromEnd(head, n) out = listNodeToString(ret) print out except StopIteration: break if __name__ == '__main__': main()