1.5尋找倒數第k個元素

尋找倒數第k個元素

方法一:

將單鏈表逆置,變換成尋找正數第k個元素node

方法二:

快慢指針法,快指針比慢指針快k個節點,當快指針到達尾節點時,慢指針爲倒數第k個節點指針

方法三:

順序遍歷兩次鏈表法,第一次遍歷求出鏈表長度n,將尋找倒數第k個元素轉換成尋找正數第n-k個元素code

代碼實現方法二:

# -*-coding:utf-8-*- 
"""
@Author  : 圖南
@Software: PyCharm
@Time    : 2019/9/5 18:03
"""
# 方法一:將單鏈表逆置,變換成尋找正數第k個元素
# 方法二:快慢指針法,快指針比慢指針快k個節點,當快指針到達尾節點時,慢指針爲倒數第k個節點
# 方法三:順序遍歷兩次鏈表法,第一次遍歷求出鏈表長度n,將尋找倒數第k個元素轉換成尋找正數第n-k個元素
# 本代碼實現方法二
class Node:
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next


def con_link(n):
    head = Node()
    cur = head
    for i in range(1, n+1):
        node = Node(i)
        cur.next = node
        cur = node
    return head


def print_link(head):
    cur = head.next
    while cur:
        print(cur.data, end=' ')
        cur = cur.next
    print()


def getLastK(head, k):
    fast = head
    slow = head
    while k:
        fast = fast.next
        k -= 1
    while fast:
        fast = fast.next
        slow = slow.next
    return slow.data



if __name__ == '__main__':
    head = con_link(7)
    print_link(head)
    print(getLastK(head, 1))

運行截圖:

衍生內容:將單鏈表向右旋轉k個節點

解題思路:

  1. 首先找到鏈表倒數第k+l個結點slow和尾結點fast;
  2. 把鏈表斷開爲兩個子鏈表,其中,後半部分子鏈表結點的個數爲k;
  3. 使原鏈表的尾結點指向鏈表的第一個結點;
  4. 使鏈表的頭結點指向原鏈表倒數第k個結點。blog

    代碼實現:

    def rotateLink(head, k):
     fast = head
     slow = head
     while k:
         fast = fast.next
         k -= 1
     while fast.next:
         fast = fast.next
         slow = slow.next
     fast.next = head.next
     head.next = slow.next
     slow.next = None
     return head

    運行截圖:

相關文章
相關標籤/搜索