zoukankan      html  css  js  c++  java
  • 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('
    ')
        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()
    

      

  • 相关阅读:
    phpexcel导出带生成图片完美案例
    让Asp.Net WebAPI支持OData查询,排序,过滤。(转)
    Workflow笔记2——状态机工作流(转)
    WebAPI请求(转)
    WebApi参数传递总结(转)
    30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)(转)
    .net 分布式架构之分布式锁实现(转)
    C#分布式事务解决方案-TransactionScope(转)
    Windows 环境下分布式跨域Session共享(转)
    Session分布式共享 = Session + Redis + Nginx(转)
  • 原文地址:https://www.cnblogs.com/gaigaige/p/11690867.html
Copyright © 2011-2022 走看看